比较两个整数:为什么== true?

时间:2011-09-05 14:46:19

标签: java integer

  

可能重复:
  Wrapper class and == operator

当我将Integer与==进行比较时,我有一些问题 你能解释一下为什么第二次测试也是成功的吗?

@Test
public void integerTest() {
    Integer prvni = 127;
    Integer druhy = 127;
    Integer treti = 128;
    Integer ctvrty = 128;

    assertTrue(prvni == druhy);
    assertTrue(treti != ctvrty);

}

3 个答案:

答案 0 :(得分:11)

使用==比较对象时,实际上是在比较引用。即两个断言都是真的原因是因为prvnidruhy 引用同一个对象tretictvrty没有。< / p>

这是因为JVM 缓存 Integer对象的范围在-128到127之间,并在自动装箱时重新使用缓存的对象。

除非您切换到int,否则您可以通过prvni.intValue()或使用prvni.equals(...)代替。

答案 1 :(得分:1)

从Java 1.5开始,some of the wrapper classes have introduced a cache。对于Integer,缓存中包含介于-128和127之间的任何数字。其他值每次都需要包含在new Integer中。

==运算符会比较引用。由于127的缓存Integer值实际上是同一个对象,==返回true。对于128个Integer个对象,它们是两个不同的对象,并且没有相同的引用相等。

有两种更可靠的方法可以比较平等:

if (treti.equals(ctvrty)) { /* do something */ }

或:

if (treti.compareTo(ctvrty) == 0) { /* do something */ }

后一种比较利用了Integer实现Comparable接口的事实,因此定义了compareTo方法,如果第一个对象“小于”,则返回负值。第二,如果第一个对象“大于”第二个,则为正值;如果对象比较相等则为零。

答案 2 :(得分:-2)

自动装箱功能为每个对象创建一个新实例。

试试这个:

int treti = 128;
int ctvrty = 128;