我想这是一个非常基本的问题,但我不知道如何理解跟随所以如果有人会这么好
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,两者都为真
Object a = 128
编译为
Object a = Integer.valueOf(128)
这称为自动装箱。
在某些 JDK 版本中,Integer.valueOf() 使用通常从 -128 到 127 的 Integer 实例缓存,并从该缓存中返回实例,而不是每次都创建一个新的 Integer 实例。这就是为什么==
127 返回 true 而 128 不返回的原因。
不要依赖这个,因为它是一个非强制性的实现细节。始终比较它们的原始 int 值或使用equals()
.
==
运算符仅适用于整数实例的缓存值。并且整数的缓存范围是从 -128 到 127。但是,在第二种情况下,Integer.intValue()
返回一个 int 原语,在这种情况下,==
运算符的工作方式与在原语情况下的工作方式相同。
有关的:
当您比较对象引用时,==
被定义为true
当引用引用相同对象时,而不是等效对象。(这就是为什么equals
。)
对于原语,==
定义true
为等效值。
在您的第一个示例中,您有两个不同的对象,一个分配给a
,另一个分配给b
。这是因为您尝试分配给引用类型的原语是“自动装箱的”(自动包装在原语的等效对象类型中)。你的代码:
Object a = 128;
Object b = 128;
...有效地处理如下:
Object a = Integer.valueOf(128);
Object b = Integer.valueOf(128);
...whereInteger.valueOf
返回一个Integer
包含您给它的值的对象,对于具有相同值的后续调用,该对象可能是也可能不是同一个对象,具体取决于您给它的值。来自 Javadoc:
Integer
如果不需要新实例,则通常应优先使用此方法,而不是构造函数Integer(int)
,因为此方法可能会通过缓存频繁请求的值来显着提高空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。
因此,这意味着当您使用值 127 运行它时,每次调用 都会返回相同的对象Integer.valueOf
,因此可以正常==
工作。但是对于 128,每次调用都会返回不同==
的对象,因此不起作用,因为它再次检查两个引用是否引用同一个对象,而不是等效的对象。
Integer.intValue() 它将对象转换为原始数据类型为 int
'==' 的功能是检查项目的平等性
如果我们检查诸如 (Integer) a == (Integer)b 之类的对象,那么它会检查
该整数值的引用,因为您将其类型转换为来自原始数据类型的对象
和 ((Integer) a).intValue() == ((Integer) b).intValue())
它检查实际值而不是参考(存储这些值的内存地址位置
如果要检查实际值,请使用 equals() 方法比较它们的值。