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

时间:2015-11-02 15:48:12

标签: java wrapper

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

3 个答案:

答案 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值。因此,当你执行==

时它们会返回true

以下是相同

的语言规范

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。