public class Test {
public static void main(String[] args) {
Integer a1 = 100;
Integer a2 = 100;
Integer a3 = 128;
Integer a4 = 128;
System.out.println(a1 == a2); //true
System.out.println(a3 == a4); //false
}
}
首先,两个对象比较是比较内存地址。也就是说,两个Integer直接比较是不会触发自动拆箱的。
那么为啥a1 == a2是true,a3 == a4却是false呢
这是因为java内部使用了享元模式,对-128到127之间的对象进行了缓存复用,所以a1、a2同一个对象。
那我让a1 = 200,岂不是a2也要等于两百?
显然不是这样的,这和String类似,实际上再赋值,a1的内存地址就变了。
从下面的源码可知,Integer对象的value一旦赋值是不可变的,因此要换value只能是换个Integer对象,然后把引用指向新的对象。