可能重复:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?
我发现了Integer对象的以下==行为,我无法理解它。 (我很清楚应该使用equals进行这样的比较,但我正在为OCPJP学习......)
简而言之,==按预期工作1000,但不适用于10。
以前的代码片段是:
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");
它表现得像人们期望的那样:
different objects
meaningfully equal
后者虽然:
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal");
具有以下输出:
same object
meaningfully equal
有人可以解释为什么会这样吗?
答案 0 :(得分:11)
自Java 5以来,引入了包装类缓存。以下是对位于Integer缓存中的内部类IntegerCache创建的缓存的检查。例如,以下代码将创建一个缓存:
Integer myNumber = 10
或
Integer myNumber = Integer.valueOf(10);
256在-128到127范围内创建整数对象,这些对象都存储在整数数组中。通过查看Integer中的内部类IntegerCache可以看到这种缓存功能:
因此,当使用Integer.valueOf创建对象或直接将值分配给-128到127范围内的整数时,将返回相同的对象。因此,请考虑以下示例:
Integer i = 100;
Integer p = 100;
if (i == p)
System.out.println("i and p are the same.");
if (i != p)
System.out.println("i and p are different.");
if(i.equals(p))
System.out.println("i and p contain the same value.");
输出结果为:
i and p are the same.
i and p contain the same value.
重要的是要注意,对象i和p只等于true,因为它们是同一个对象,比较不基于值,它基于对象相等。如果Integer i和p超出-128或127范围,则不使用缓存,因此会创建新对象。在进行值的比较时,请始终使用“.equals”方法。同样重要的是要注意实例化Integer不会创建此缓存。
请记住,“==”总是用于对象相等,它没有因为比较未装箱的值而超载
答案 1 :(得分:10)
见Integer wrapper objects share the same instances only within the value 127?。 Integer类保持共享值的共享静态实例。