相等有两种,其一是==表示的引用等价,另一种是每个对象继承自Object或自己重写的equals方法所表示的对象等价
通常来说两个Integer对象即使值相同,在用==判断引用等价的时候也会不相等,因为他们所处的内存地址不相同。然而在对Integer对象使用==比较的时候存在着一个特殊情况,当两个对象的值都在-128至127之间的时候,他们的数值相等的同时也会有引用等价,也就是说他们来自同一个内存地址。
这是因为jvm在运行时创建了一个缓存区域,并创建了一个integer的数组。这个数组存储了-128至127的值。因此如果integer的值在-128至127之间,则是去缓存里面获取。所以会有相同的内存地址。
附上一小段demo,便于大家理解。
public static void main(String[] args) { Integer integer1 = 127; Integer integer2 = 127; System.out.println(integer1 == integer2); Integer integer3 = 128; Integer integer4 = 128; System.out.println(integer3 == integer4); }
第一行输出true,第二行输出false。
另外,如果使用new关键字的话,即使对于-128至127的数,由于new的作用是开辟新的内存空间,所以==的结果会是false,如下:
public static void main(String[] args) { Integer integer1 = new Integer(127); Integer integer2 = new Integer(127); System.out.println(integer1 == integer2); }
不过这种写法已经过时,自从jdk9之后就不再使用了,这里面只不过拿来测试一下。
原文:https://www.cnblogs.com/owczhlol/p/13093507.html