Java基础_关于integer 128的“==”问题

题外话

首先是Java在1.5后引入了自动拆装箱

    public static  void main(String[]args){
        Integer intg=1; //装箱
        int i=intg; //拆箱
    }
实际上那: 

    自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。

 
    Integer intg=Intg.valueOf(1); 
    int i=intg.intValue(); 

正题:

public static void main(String[]) aa {
 
    Integer integer1 = 127;
    Integer integer2 = 127;
 
    if (integer1 == integer2)
        System.out.println("integer1 == integer2");
    else
        System.out.println("integer1 != integer2");
 
    Integer integer3 = 128;
    Integer integer4 = 128;
 
    if (integer3 == integer4)
        System.out.println("integer3 == integer4");
    else
        System.out.println("integer3 != integer4");
 
}

  输出:  integer1 == integer2
         integer3 != integer4

为什么这样呢

自动拆装箱机制提供了一个缓存机制来节省内存和提高性能,Integer对象通过使用相同的对象引用来比较大小,而这个相同的对象就是缓存;即:

  public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

自动装箱时,如果数字在-128至127之间时,会直接使用缓存中的对象,而不是重新创建一个对象,否则会重新创建对象,

所以之所以Integer对象可以比较值大小,也是比的对象;

但是在比较两个对象相等时,在上面的范围内可以“==”,超过就得老老实实“equals”

"==":

1.若两者都是引用类型,则比较的是地址

2.若有一方是引用类型一方为基础类型则自动拆箱比较值得大小

“equals”

1基本类型(值类型)之间无法使用equals比较。
2. equals参数为值类型,则参数会进行自动装箱为包装类型,
3. equals参数为包装类型,则先比较是否为同类型,非同类型直接返回false,同类型再比较值。

 

你可能感兴趣的:(Java基础_关于integer 128的“==”问题)