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

可能重复:
包装类和==运算符

嗨,当我比较整数与==我有一些问题所以你能解释我为什么第二次测试也成功吗?

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

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

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

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

从Java 1.5开始, 一些包装类引入了缓存 。 对于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方法,如果第一个对象是“小于”第二个,则返回负值,如果第一个对象是“大于”,则返回正值。第二,如果对象比较相等则为零。

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

尝试这个:

 int treti = 128; int ctvrty = 128;