已知如下代码段
Integer a = 3;
Integer b = 3;
Integer c = new Integer(3);
Integer d = new Integer(3);
Integer e = 128;
Integer f = 128;
对于下面的代码:
System.out.println("3的包装类实例是否大于1:"+(c > 1));//true
这是因为包装类是引用类型,但是当与数值类型比较时会直接取出包装类实例所包装的数值进行比较。
System.out.println("两个包装类实例是否相等:"+(c == d));//false
两个包装类比较时实际是两个引用类型在比较,只有指向同一个对象时才会true,new了两个新的对象所以上面代码段输出false
但是神奇的一点是下面两个结果
System.out.println("两个3自动装箱后是否相等"+(a == b));//ture
System.out.println("两个128自动装箱后是否相等"+(e == f));//false
为什么会出现这种结果呢?
这是因为在java.lang.Integer源码中将-128 到127之间的整数自动装箱为Integer实例,并放入一个cache数组缓存起来。如果之后把一个 -128到127范围内的整数自动装箱为一个Integer实例时,实际上是直接指向缓存的数组元素。所以该范围的自动装箱时引用的是同一个数组元素,所以他们相等。
若是自动装箱Integer实例时超出缓存数组范围,系统就会重新创建一个Integer实例,此时相当于Integer a = new Integer(128);
所以此时这两个包装类的实例就不相等了