非常清楚的是,缓存会对性能造成不可接受的影响–每次创建Integer时,都会产生额外的if语句和内存查找。仅此一个因素就掩盖了任何其他原因,而使该线程感到痛苦的其余部分。
就“正确”响应==而言,OP在其正确性假设中是错误的。整数确实通过Java社区对正确性的期望,当然也通过规范对正确性的定义,对==做出正确的响应。也就是说,如果两个引用指向同一对象,则它们为
==。如果两个引用指向
不同的 对象,即使它们具有相同的内容,它们 也不
==是相同的。因此,得出的结果就不足为奇
new Integer(5) == newInteger(5)了
false。
更为有趣的问题是, 为什么
new Object();每次都需要创建一个唯一的实例?即为什么
newObject();不允许缓存?答案是
wait(...)和
notify(...)。缓存
newObject()s会错误地导致线程在不应该同步时彼此同步。
如果不是那样的话,那么Java实现可以完全
new Object()单例缓存s。
new Integer(5)这就说明了为什么必须创建7个唯一的
Integer对象(每个对象都包含值5
)需要完成7次(因为
Integerextend
Object)。
次要的,不太重要的东西: 自动装箱和自动拆箱功能导致本来不错的方案中的一个问题。没有该功能,您将无法进行比较
new Integer(5) ==5。要启用这些功能,Java 会将 对象 取消装箱 (并且 不对 原语进行装箱)。因此
new Integer(5) ==5被转换为:(
new Integer(5).intValue() == 5而 不是
new Integer(5) == newInteger(5)。
最后一两件事要了解是那个自动装箱
n时 不 被做
new Integer(n)。通过内部调用来完成
Integer.valueOf(n)。
如果您认为自己了解并想要测试自己,请预测以下程序的输出:
public class Foo { public static void main (String[] args) { System.out.println(Integer.valueOf(5000) == Integer.valueOf(5000)); System.out.println(Integer.valueOf(5000) == new Integer(5000)); System.out.println(Integer.valueOf(5000) == 5000); System.out.println(new Integer(5000) == Integer.valueOf(5000)); System.out.println(new Integer(5000) == new Integer(5000)); System.out.println(new Integer(5000) == 5000); System.out.println(5000 == Integer.valueOf(5000)); System.out.println(5000 == new Integer(5000)); System.out.println(5000 == 5000); System.out.println("====="); System.out.println(Integer.valueOf(5) == Integer.valueOf(5)); System.out.println(Integer.valueOf(5) == new Integer(5)); System.out.println(Integer.valueOf(5) == 5); System.out.println(new Integer(5) == Integer.valueOf(5)); System.out.println(new Integer(5) == new Integer(5)); System.out.println(new Integer(5) == 5); System.out.println(5 == Integer.valueOf(5)); System.out.println(5 == new Integer(5)); System.out.println(5 == 5); System.out.println("====="); test(5000, 5000); test(5, 5); } public static void test (Integer a, Integer b) { System.out.println(a == b); }}为了获得额外的信用,如果所有值
==都更改为,还可以预测输出
.equals(...)
更新: 感谢用户@sactiw的评论:“缓存的默认范围是-128到127,并且从Java 1.6开始,您可以通过从命令行传递-
XX:AutoBoxCacheMax =来重置上限值> = 127”



