2011-09-05 72 views
3

可能重复:
Wrapper class and == operator比较两个整数:为什么==真?

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

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

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

} 
+1

另外:http://stackoverflow.com/questions/5117132/wrapper-objects-share-the-same-address-space-only-within-the-value-127 –

回答

11

使用==来比较对象时,实际上是比较引用。即,两个断言均为真的原因是因为prvnidruhy指的是相同的对象,而tretictvrty没有。

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

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

+0

如果您将128更改为数字该范围(例如125)代码按预期工作。 java为什么不在运行时缓存数字? – leifg

+0

范围是错误的 - 它是-128到127. –

+1

@leifg:Java使用一个数组作为'Integer'缓存的后备存储。数组不能在运行时重新调整大小,也不能用于稀疏结构(即将值缓存起来,而两者之间没有缓存对象)。一个'Hashtable'或类似的可以被使用,但是那些只允许有'Object'键,这意味着你必须使用'Integer'对象(而不是'int'原语)作为键,整个问题又来了!所以唯一的选择是使用一个合理范围的数组。 –

-2

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

试试这个:

int treti = 128; 
int ctvrty = 128; 
+0

-1:不解释为什么127案件的作品,并没有完全回答这个问题。查看包装类缓存。 –

1

由于Java 1.5,some of the wrapper classes have introduced a cache。对于Integer,高速缓存中包含-128至127之间的任何数字。其他值需要每次包装在new Integer中。

==运算符比较引用。由于127的高速缓存整数值实际上是完全相同的对象,因此==返回true。对于128 Integer对象,它们是两个不同的对象,并且没有相同的引用等式。

有两种更可靠的方式,你可以比较平等:

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

或:

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

后者比较需要的是Integer实现Comparable接口的事实优势,从而定义了一个compareTo如果第一个对象“小于”第二个,则返回负值,如果第一个对象“大于”第二个,则返回正值;如果对象比较相等,则返回零。