通常,使用==无法比较Java库中对象的引用,但我刚刚检查过:
Integer x = 5;
Integer y = x + 1;
Integer z = y - 1;
x.equals(z)
true (boolean)
x == z
true (boolean)
Run Code Online (Sandbox Code Playgroud)
这只是我的IDE的工件,还是Java Integer对象保证在它们具有相同值时指向相同的Integer?后一种保证会简化我正在编写的一些代码.
当它们是.equals()时,Java整数总是==吗?
不是.在正常情况下,你不能依靠==
与Integer
实例试图数值比较时.为此,您必须int
在比较之前将其拆箱,或使用equals
.
您在示例中看到的是JDK缓存并重用有限数量的Integer
实例(用于Integers
表示-128到127).来自Integer.valueOf(int)
:
此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值.
现在,你的代码使用装箱转换而不是Integer.valueOf
,并且规范并没有说装箱转换使用Integer.valueOf
,但它可能正是他们所做的(实际上;例如,拳击转换和Integer.valueOf
使用相同的底层机制和缓存).
如果使用不同的值,您可以看到==
对于Integer
实例不可靠:( 实时复制)
Integer x = 524; // <==== Changed
Integer y = x + 1;
Integer z = y - 1;
System.out.println("equals? " + x.equals(z));
System.out.println("==? " + (x == z));
Run Code Online (Sandbox Code Playgroud)
输出(可能,这是我在IDEOne上得到的,但文档说再次Integer
可以缓存其他值):
equals? true ==? false