【发布时间】:2020-06-16 14:37:14
【问题描述】:
在比较 Integer 对象和常量值时,Java 是否将值装箱或取消装箱 Integer 对象?
根据我所阅读的内容,“==”是一个引用比较,因此假设 Java 将常量装箱以执行对象之间的引用比较是合乎逻辑的。然而,下面的测试代码似乎给出了矛盾的结果。
Integer v1 = 1000;
Integer v2 = 1000;
boolean b1 = v1 == 1000; //True.
boolean b2 = v1 == v2; //False. Proof that 1000 boxes to new object and is not fetched from cache.
那么使用== 进行对象与常量值比较如何在Java 中工作?这种情况下算子是按值比较的吗?
【问题讨论】:
-
使用
Integer::valueOf(1000)给你一些缓存的机会。 -
IIRC,JLS 默认只需要缓存 256 个值,即从 -128 到 127。此外,
Integer v1 = 1000;在内部调用value0f方法。 -
保证缓存-128到127,但可能缓存更多。如果您使用
valueOf,它可能会缓存,也可能不会 - 至少有机会! -
我不需要明确使用
valueOf方法。 装箱在内部调用该方法。Integer v1 = 1000;和Integer v1 = Integer.valueOf(1000);是一样的,我用调试器就知道了。
标签: java reference equals comparison-operators