java == for Integer

use*_*692 8 java integer ocpjp

可能重复:
java上的行为不一致==
整数包装器对象仅在值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");
Run Code Online (Sandbox Code Playgroud)

它的行为与人们期望的一样:

different objects
meaningfully equal
Run Code Online (Sandbox Code Playgroud)

后者虽然:

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal"); 
Run Code Online (Sandbox Code Playgroud)

有以下输出:

same object
meaningfully equal
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

San*_*air 11

从Java 5开始,引入了包装类缓存.以下是对位于Integer缓存中的内部类IntegerCache创建的缓存的检查.例如,以下代码将创建一个缓存:

Integer myNumber = 10
Run Code Online (Sandbox Code Playgroud)

要么

Integer myNumber = Integer.valueOf(10);
Run Code Online (Sandbox Code Playgroud)

256在-128到127的范围内创建整数对象,这些对象都存储在整数数组中.通过查看内部类IntegerCache可以看到这个缓存功能,IntegerCache位于Integer中:

因此,当使用Integer.valueOf创建对象或直接将值分配给-128到127范围内的Integer时,将返回相同的对象.因此,请考虑以下示例:

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.");
Run Code Online (Sandbox Code Playgroud)

输出是:

i and p are the same.
i and p contain the same value.
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,对象i和p只等于true,因为它们是同一个对象,比较不是基于值,而是基于对象相等.如果Integer i和p超出-128或127范围,则不使用缓存,因此会创建新对象.在进行值的比较时,请始终使用".equals"方法.同样重要的是要注意实例化Integer不会创建此缓存.

请记住,"=="始终用于对象相等,它没有因为比较未装箱的值而过载


Gra*_*and 10

请参阅整数包装器对象仅在值127内共享相同的实例?.Integer类为共同值保留共享静态实例.