写了一段判断数值相等判断方法的程序:
//在-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 相等的问题:
为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象
而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;