通常,使用==无法比较Java库中对象的引用,但我刚检查过:
Integer x = 5;
Integer y = x + 1;
Integer z = y - 1;
x.equals(z)
true (boolean)
x == z
true (boolean)
这只是我的IDE的工件,还是Java Integer对象保证在它们具有相同值时指向相同的Integer?后一种保证会简化我正在编写的一些代码。
答案 0 :(得分:7)
Java整数是否总是==当它们是.equals()?
没有。在正常情况下,在尝试进行数值比较时,您不能依赖==
和Integer
个实例。为此,您必须在比较前将其解包至int
,或使用equals
。
您在示例中看到的是JDK缓存并重用有限数量的Integer
个实例(代表-128到127的Integers
)。来自Integer.valueOf(int)
:
此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
现在,您的代码正在使用装箱转换而不是Integer.valueOf
,以及装箱转换使用Integer.valueOf
的规范doesn't say,但这可能是因为{'}正是他们所做的(实际上;例如,装箱转换和Integer.valueOf
使用相同的底层机制和缓存)。
如果您使用不同的值,则==
个实例Integer
不可靠:live copy)
Integer x = 524; // <==== Changed
Integer y = x + 1;
Integer z = y - 1;
System.out.println("equals? " + x.equals(z));
System.out.println("==? " + (x == z));
输出(可能,也就是我在IDEOne上得到的内容,但文档再说Integer
可能缓存其他值):
equals? true ==? false
答案 1 :(得分:2)
并非总是如此,但具体范围。
这里的问题是Java捕获了-128到127范围内的Integer值。因此,当你执行==
以下是相同
的语言规范http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7
如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。
的情况
我记得这样做的原因是为了在小型设备上实现性能。
答案 2 :(得分:2)
不,不保证。对于某些值(特别是较小的,更常用的值),该值将被内化,并且将重用相同的对象引用。如果您尝试使用3,279,831进行相同的测试,它可能会返回false。