美文网首页
Integer 的自动拆箱和装箱

Integer 的自动拆箱和装箱

作者: 等等ChEnH | 来源:发表于2019-11-14 14:50 被阅读0次
Integer和int的区别

1、Integer是int的包装类,int则是java的一种基本数据类型

2、Integer变量必须实例化后才能使用,而int变量不需要

3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

4、Integer的默认值是null,int的默认值是0

先看下测试代码

public class TestInteger {
    public static void main(String[] args) {
        int a = 3;
        int b = 3;
        System.out.println("a与b是否相等?"+(a == b));//基本数据类型比较
        
        Integer aa = 3; 
        System.out.println("a与aa是否相等?"+ (a == aa));//自动拆箱,比较基本数据类型
        
        Integer bb = 3;//自动装箱
        System.out.println("aa与bb是否相等?"+ (aa == bb));
        
        Integer zz = 128;
        Integer ww = 128;
        System.out.println("zz与ww是否相等?"+ (zz == ww));
        
        Integer qq = new Integer(3);
        Integer pp = new Integer(3);
        System.out.println("qq与pp是否相等?"+(qq == pp));
    }
}

测试结果如下:


测试结果

反编译查看代码:

public class TestInteger
{
  public static void main(String[] args) {
    int a = 3;
    int b = 3;
    System.out.println("a与b是否相等?" + ((a == b) ? 1 : 0));
    
    Integer aa = Integer.valueOf(3);
    System.out.println("a与aa是否相等?" + ((a == aa.intValue()) ? 1 : 0));

    
    Integer bb = Integer.valueOf(3);
    System.out.println("aa与bb是否相等?" + ((aa == bb) ? 1 : 0));
    
    Integer zz = Integer.valueOf(128);
    Integer ww = Integer.valueOf(128);
    System.out.println("zz与ww是否相等?" + ((zz == ww) ? 1 : 0));
    
    Integer qq = new Integer(3);
    Integer pp = new Integer(3);
    System.out.println("qq与pp是否相等?" + ((qq == pp) ? 1 : 0));
  }
}

1、a与b是否相等?两个基本数据类型比较,毋庸置疑结果为true
2、a与aa是否相等?Integer aa = 3; 编译后为Integer aa = Integer.valueOf(3);这就是基本数据类型的自动装箱。当aa和基础数据类型int a比较时,自动拆箱为 aa.intValue(),两个基本数据类型的比较。结果也为true
3、aa和bb是否相等?Integer bb = Integer.valueOf(3); 和 Integer aa = Integer.valueOf(3);比较。源码分析我们看下Integer.valueOf方法

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

i >= -128 并且 i <= 127 的时候,第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。比较结果为true
4、zz与ww是否相等? 128不在 -128到127区间范围内,第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。比较结果为false
5、qq与pp是否相等?这两个值虽然值都为3,但是我们都是通过 new 关键字来创建的两个对象,两个用new关键字创建的对象用 == 进行比较,结果当然为 false。

相关文章

网友评论

      本文标题:Integer 的自动拆箱和装箱

      本文链接:https://www.haomeiwen.com/subject/aijrictx.html