原始值如何存储在对象中以及在对象被转换时会发生什么

时间:2013-04-08 13:57:02

标签: java integer primitive

这是一个非常基本的问题我想但我不确定如何不遵守所以如果有人会这么善良

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

“a”为假而“b”为真,a = 127且b = 127

4 个答案:

答案 0 :(得分:7)

Object a = 128

编译为

Object a = Integer.valueOf(128)

这称为自动装箱。

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

不要依赖于此,因为它是非强制性的实现细节。始终比较其原始int值或使用equals()

答案 1 :(得分:5)

==运算符仅适用于整数实例的缓存值。并且整数的缓存范围是从-128到127.然而,在第二种情况下,Integer.intValue()返回一个int原语,在这种情况下==运算符在原语的情况下工作。

相关:

Puzzling behaviour of == after postincrementation

答案 2 :(得分: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,每次调用都会返回不同的对象,因此==不起作用,因为它再次检查两个引用是否引用了相同的对象,而不是等同的。

答案 3 :(得分:1)

Integer.intValue()它将对象转换为原始数据类型为int

' =='的功能是检查项目的真实性

如果我们检查对象如(整数)a ==(整数)b那么它会检查

引用该整数值,因为您将其作为原始数据类型

中的对象进行了类型转换

和((整数)a).intValue()==((整数)b).intValue())

它检查实际值而不是引用(存储这些值的存储器地址位置

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