比较两个整数:为什么== true?
可能重复:
包装类和==运算符
嗨,当我比较整数与==我有一些问题所以你能解释我为什么第二次测试也成功吗?
@Test public void integerTest() { Integer prvni = 127; Integer druhy = 127; Integer treti = 128; Integer ctvrty = 128; assertTrue(prvni == druhy); assertTrue(treti != ctvrty); }
使用==
比较对象时,实际上是在比较引用。 即,两个断言都是真的原因是因为prvni
和druhy
指的是同一个对象,而treti
和ctvrty
则没有。
这是因为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;