当它们是.equals()时,Java整数总是==吗?

Wil*_*per 3 java wrapper

通常,使用==无法比较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?后一种保证会简化我正在编写的一些代码.

T.J*_*der 7

当它们是.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

  • 不知道为什么有人会拒绝明确正确的答案 (2认同)