Java 中数值变量赋值有关问题

Java 中数值变量赋值问题

 

写了一段判断数值相等判断方法的程序:

 

		//在-128~127 之外的数
		 Integer i1 = 200;
		 Integer i2 = 200;
		 System.out.println("i1==i2: "+(i1==i2));//false
		 // 在-128~127 之内的数
		 Integer i3 = 100;
		 Integer i4 = 100;
		 System.out.println("i3==i4: "+(i3==i4));//true
		 
		 Long l1 = 9L;//内存机制
		 Long l2 = 9L;
		 //实际上内存中l1只是一个long类型的变量,它存在于向stack(栈)中,数值并不在其中存放,
		 //它指向heap(堆)中另一块真正存放数值的内存,加L的目的就是为了让heap中也创建一块long类型所需要的内存,用来来放数值。
		 //所以说=前后两者其实是在不同的两块内存,只不过有个无形的指针将两者连接起来了。
		 System.out.println("l1 == l2: " + (l1 == l2));//true
		 //原因:http://www.2cto.com/kf/201305/215619.html
		 
		 Long t1 = new Long ("9");
		 Long t2 = new Long ("9");
		 //2个对象开辟的内存空间不同
		 System.out.println("t1 == t2: " + (t1 == t2));//false

 

 

结果:

i1==i2: false
i3==i4: true
l1 == l2: true
t1 == t2: false

 

看来Java 中的自动装箱/拆箱以及包装类变量赋值还是有些讲究的。

 

 i1, i2 不相等, i3,i4 相等的问题:

参考: http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html

为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象

而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;
想到, 我们循环时经常用到的i= 0, 和list.get(0) ,等情况, 小数值确实利用率很高, 这么做的内存利用得到提高是不少的.
l1和l2 对象的问题 ,  9L 在内存中也是分配到一个地址, l1 和 l2 是引用同一个 9L  的,这点的机制和String 是一样的, 相同字符串常量的内存都是存放在堆中,
 t1 和 t2 分别创建了2个不同的内存对象, 其内存地址不同.