以下程序的输出是什么?如何?

时间:2015-06-30 14:36:06

标签: java integer

public class MainClass

{

    public static void main(String[] args)
    {
        Integer i1 = 127;

        Integer i2 = 127;

        System.out.println(i1 == i2);

        Integer i3 = 128;

        Integer i4 = 128;

        System.out.println(i3 == i4);
    }
}

i1,i2,i3,i4不是对象我猜它们只是参考变量。那么它们如何与类变量的工作方式不同呢?

我听到的答案是

true
false
但是怎么样?为什么它与127和128不同?

2 个答案:

答案 0 :(得分:1)

自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不会创建此缓存。

请记住,“==”总是用于对象相等,它没有因为比较未装箱的值而超载

另见Integer wrapper objects share the same instances only within the value 127?

答案 1 :(得分:0)

Integer是一个对象,因此==检查变量是否引用完全相同的实例。可以使用myObject.equals(otherObject)

检查对象的等同性

int是Integer的原始类型,在这种情况下,如果两个int具有相同的,则==将返回true

更新:请注意,在某些情况下,对于String,例如,两个变量可以共享相同的引用,这取决于代码和编译器,但仍然不是您应该基于代码逻辑的东西。