2013-04-08 32 views
1

这是一个非常基本的问题,我想,但我不知道如何已了解下列因此,如果有人会这么好心发生什么如何原始值存储在对象,当对象被投

Object a = 128; 
Object b = 128; 
Log.debug("a: " + ((Integer) a == (Integer)b)); 
Log.debug("b: " + (((Integer) a).intValue() == ((Integer) b).intValue())); 

“一“是假的,而”b“是真的,两者对于a = 127和b = 127都是正确的。

+0

请记住,当你真的想要使用'equals()'时,不要使用'==' – Shark 2013-04-08 13:59:08

回答

5

当你比较对象引用,==是当引用参考同一个对象,并不等同对象定义为true。 (这就是equals的用途。)

对于基元,==定义为true等效值。

在第一个示例中,您有两个不同的对象,一个分配给a,另一个分配给b。这是因为您要分配给引用类型的原语是“autoboxed”(自动包装在原语的等效对象类型中)。您的代码:

Object a = 128; 
Object b = 128; 

...是有效的治疗是这样的:

Object a = Integer.valueOf(128); 
Object b = Integer.valueOf(128); 

...其中Integer.valueOf返回Integer对象包装你给它的价值,这可能会或可能不会是相同的对象用于具有相同值的后续调用,具体取决于您给予的值。根据JavaDoc:

如果不需要新的Integer例如,这种方法一般应优先使用构造Integer(int),因为此方法可能通过缓存经常请求的值,以产生显著更好的空间和时间性能。此方法将始终缓存-128至127(含)范围内的值,并可缓存此范围之外的其他值。

因此,这意味着,当你与价值127跑了,你得为每个调用同一对象Integer.valueOf,所以==工作。但是对于128,每个调用都会得到不同的对象,因此==不起作用,因为它再次检查两个引用是指相同对象,而不是等价对象。

+1

我没有听到一会儿提到的自动装箱,好的;) – Shark 2013-04-08 14:01:32

+1

这并不能解释为什么这个例子适用于127而不是128.当你假设语句被翻译成“Object a = Integer.valueOf(128)”并且窥视了valueOf()的javadoc:“返回一个表示指定int值的Integer实例时, ..],因为此方法通过缓存经常请求的值可能会产生显着更好的空间和时间性能。此方法将始终缓存范围在-128至127之间的值,并且可能会缓存该范围之外的其他值。 – 2013-04-08 14:25:18

+0

@GyroGearless:谢谢你。我错过了OP说它适用于127,并且不知道关于'Integer.valueOf'的缓存。 – 2013-04-08 14:28:14

7
Object a = 128 

被编译成

Object a = Integer.valueOf(128) 

这就是所谓的自动装箱。

在一些JDK版本中,Integer.valueOf()使用通常从-128到127的Integer实例缓存,并且从此缓存返回实例,而不是每次都创建一个新的Integer实例。这就是为什么==为127而不是为128返回true。

不要依赖这个,因为它是一个非强制的实现细节。始终比较它们的基本int值或使用equals()

1

Integer.intValue()将其转换目的是原始数据类型为INT

的“==”是检查项目

的euqality如果我们与对象检查如函数(整数)一个==(整数)b,则它检查该整数值的

refrences因为你从原始数据类型

和((整数)一).intValue()==((整数)类型强制转换它作为对象b).intValue())

它检查实际值不参考(存储这些值的地址位置

如果要检查实际值,请使用equals()方法比较它们的值。