在Java1.5支持了自动装箱和拆箱功能。什么是装箱和拆箱呢?把基本数据类型转换成包装类类型就是装箱,把包装类类型装换成基本数据类型就是拆箱。

 

1.代码举例自动拆箱和包装过程

 

package eclipse;

 

public class Test_Integer {

   public static void main(String[] args) {
     intx = 100;
     Integer ig = new Integer(x); //手动装箱
     inty = ig.intValue();       //手动拆箱
     Integer i1 = 100;   //直接把基本数据类型100赋值给了包装类,这个叫自动包装
     intz = i1 + 200; // 看输出结果是300,说明i1实现了自动拆箱过程。
     System.out.println(z);
   }
}

2.Integer面试题

 

阅读下面程序,请写出输出结果。

 

package eclipse;

public class Test_Integer {

   public static void main(String[] args) {

     Integer i1 = new Integer(97);   
     Integer i2 = new Integer(97); 
     System.out.println(i1 == i2);
     System.out.println(i1.equals(i2));
     System.out.println("----------------");

     Integer i3 = new Integer(197);  
     Integer i4 = new Integer(197);
     System.out.println(i3 == i4);
     System.out.println(i3.equals(i4));
     System.out.println("----------------");

     Integer i5 = 97;   
     Integer i6 = 97; 
     System.out.println(i5 == i6);
     System.out.println(i5.equals(i6));
     System.out.println("----------------");

     Integer i7 = 197;  
     Integer i8 = 197;
     System.out.println(i7 == i8);
     System.out.println(i7.equals(i8));

   }
}

输出:

false

true

----------------

false

true

----------------

true

true

----------------

false

true

 

分析:

      在String类前面文章,我们画过内存图。已经了解到== 这个符号既可以比较基本数据类型和引用数据类型,如果是基本数据类型,比较的是值相同,如果是引用数据类型,比较的是对象的内存地址是否相同。利用equals方法比较的是值是否相同,因为Integer类里面重写了Object类的equals方法。

 

      所以,上面的equals方法打印输出都是true,这个很简单,没有疑问。然后来看,前面两组里面的==判断,由于==是比较内存地址,我们看到s1 s2 s3 s4都使用了new关键字,所以这两组里面的==比较也是不相等,内存地址不同。

 

      最后来看后两组,同样是自动包装,为什么97就输出true,而197就不相等。我们这里先抛出个结论:在Java中,byte的取值范围是-128到127之间。在自动包装和拆箱中,如果变量取值范围在byte的范围内,在自动包装和拆装过程中就不新创建对象(堆内存);如果范围不在byte取值范围内,就会新创建Integer对象。

 

      这个结论,可以通过查看源码来找到答案。在eclipse中点击Integer,进入查看源码。然后找到以下图中的方法。

Java tcp 拆包粘包处理 java拆包装包_System

       继续通过点击查看low和high的值,可以知道low是-128,hight是127.所以,上面这个方法的意思就是:如果变量i大于-128并且小于127,Cache是缓存的意思,这里真实的意思就是去常量池去取。如果不在-128到127范围,就使用new关键字去新建一个Integer对象。