当我将Integer与==进行比较时,我有一些问题 你能解释一下为什么第二次测试也是成功的吗?
@Test
public void integerTest() {
Integer prvni = 127;
Integer druhy = 127;
Integer treti = 128;
Integer ctvrty = 128;
assertTrue(prvni == druhy);
assertTrue(treti != ctvrty);
}
答案 0 :(得分:11)
使用==
比较对象时,实际上是在比较引用。即两个断言都是真的原因是因为prvni
和druhy
引用同一个对象而treti
和ctvrty
没有。< / 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;