java中的自动装箱与自动拆箱

来源:互联网 发布:阿里健康数据研究中心 编辑:程序博客网 时间:2024/05/22 16:01

1.自动装箱(Autoboxing)

基本数据类型不是对象,没有可以调用的方法,可以使用它的包装类型来调用一些如toString(),getClass()之类的方法。
如:Integer i = 10; 这时编译器实际执行的是 Integer i = Integer.valueOf(10);
这就是自动装箱。自动装箱就可以把一个基本数据类型子动变成一个包装类型。
使用反编译软件查看:

2.自动拆箱(unboxing)

自动拆箱跟自动装箱相反,自动拆箱是把Integer这样的包装类型重新简化为基本数据类型。
如: int k = new Integer(2); 这时编译器实际执行的是int k = new Integer(2).intValue();
这就是自动拆箱。使用反编译软件查看:

3.基本数据类型对应的包装类型的自动装箱池大小

  • Byte,Short,Integer,Long默认情况下是-128~127
  • Character的是0~127
  • Float和Double没有自动装箱池

4.装箱池的作用

在装箱池指定的范围内会有缓存对象,加入是在范围的值会直接取已有的缓存对象,而不会new一个。
例如:

 public static Integer valueOf(inti) {            if(i >= -128 &&i <=IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127             //如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象             return IntegerCache.cache[i + 128];            else             return new Integer(i); //否则就在堆内存中创建       }    

5.实例

        Integer integer1 = 100;        Integer integer2 = 100;        Integer integer3 = 200;          Integer integer4 = 200;          Integer integer5 = new Integer(100);          Integer integer6 = new Integer(100);         int int1 = 100;          int int2 = 200;          System.out.println("integer1==integer2: " + (integer1 == integer2));        //ture  自动装箱,两个缓存中的Integer对象的引用来进行比较,所以是true        System.out.println("integer1.equals(integer2): " + (integer1.equals(integer2)));        // true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true        System.out.println("integer3==integer4: " + (integer3 == integer4));        // false 自动装箱,两个非缓存对象,而是new出来的不同对象的引用进行比较,所以为false        System.out.println("integer3>integer4: " + (integer3 > integer4));         // false 自动拆箱,再比较大小 ,明显不成立        System.out.println("integer3.equals(integer4): " + (integer3.equals(integer4)));        // true Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true        System.out.println("integer5==integer6: " + (integer5 == integer6));         // false 两个不同的Integer对象引用的比较肯定为false        System.out.println("integer5.equals(integer6): " + (integer5.equals(integer6)));        // true  Integer中对equals方法进行了重写,比较的的是两个对象的值是否相等,所以为true        System.out.println("integer1==int1: " + (integer1 == int1));        // true  将Integer缓存对象拆箱后与int比较,即两个int类型进行比较,所以为true         System.out.println("integer1.equals(int1): " + (integer1.equals(int1)));        // true  重写的equals方法中的方法参数是Object类型,不能传一个基本数据类型的参数进去,所以发生了自动装箱,        //       int1被自动装箱为Integer类型,而Integer类型的最终父类是Object类型,然后就是两个Integer        //       类型进行equals比较        System.out.println("integer3==int2: " + (integer3 == int2));        // true  Integer对象拆箱后与int比较,所以为true          System.out.println("integer3.equals(int2): " + (integer3.equals(int2)));        // true  与倒3个输出原理相同

使用反编译查看

Integer integer1 = Integer.valueOf(100);    Integer integer2 = Integer.valueOf(100);    Integer integer3 = Integer.valueOf(200);    Integer integer4 = Integer.valueOf(200);    Integer integer5 = new Integer(100);    Integer integer6 = new Integer(100);    int int1 = 100;    int int2 = 200;    System.out.println("integer1==integer2: " + (integer1 == integer2));    System.out.println("integer1.equals(integer2): " + integer1.equals(integer2));    System.out.println("integer3==integer4: " + (integer3 == integer4));    System.out.println("integer3>integer4: " + (integer3.intValue() > integer4.intValue()));    System.out.println("integer3.equals(integer4): " + integer3.equals(integer4));    System.out.println("integer5==integer6: " + (integer5 == integer6));    System.out.println("integer5.equals(integer6): " + integer5.equals(integer6));    System.out.println("integer1==int1: " + (integer1.intValue() == int1));    System.out.println("integer1.equals(int1): " + integer1.equals(Integer.valueOf(int1)));    System.out.println("integer3==int2: " + (integer3.intValue() == int2));    System.out.println("integer3.equals(int2): " + integer3.equals(Integer.valueOf(int2)));

参考文章

原创粉丝点击