jdk5的拆箱与装箱

    前几次课的讲解,我们了解了这样几个问题。<nobr οncοntextmenu="return false;" οnmοusemοve="kwM(0);" id="key0" οnmοuseοver="kwE(event,0, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" οnclick="return kwC();" οnmοuseοut="kwL(event, this);" target="_blank">Java</nobr>的两种数据类型,和一些程序控制语句。今天,我们还是要通过一些例子。对上述东西有一个更深的理解。

    我们现在知道了,所有对象型的数据类型的基类是java.lang.Object .而写java程序的时候非常多的工作都是在写这些类,和实现里面的<nobr οncοntextmenu="return false;" οnmοusemοve="kwM(3);" id="key3" οnmοuseοver="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" οnclick="return kwC();" οnmοuseοut="kwL(event, this);" target="_blank">方法</nobr>。而偏偏就有那么8种基本类型和他们不一样。以至于让你来回在这两种之间转换,这是很让人头疼的事情。Java中int,long,char这样的类型不是对象型。因此java里提供了一种叫做包装类(wrapper)的东西,使基本类型,有着相应的对象类型Integer,Long,Character等。这样就可以,先把基本类型的东西,转成对象来用,然后再转回去。来来回回,千锤百炼。

    到了jdk5.0的时候呢,就不用了。看下面的例子:

<nobr οncοntextmenu="return false;" οnmοusemοve="kwM(2);" id="key2" οnmοuseοver="kwE(event,2, this);" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" οnclick="return kwC();" οnmοuseοut="kwL(event, this);" target="_blank">实践</nobr>:

java 代码
  1. public class Test1 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.         // 装箱   
  6.   
  7.         int i = 0;   
  8.   
  9.         Integer integer = i;//i这么一个基本类型的数,可以赋值给Integer型的变量   
  10.   
  11.         // 简单的拆箱   
  12.   
  13.         int j = integer; //integer这种原始类型的数,也能赋值给j这个原始类型的变量   
  14.   
  15.     
  16.   
  17.         Integer counter = 1;        // 装箱   
  18.   
  19.         int counter2 = counter;     // 拆箱   
  20.   
  21.     
  22.   
  23.         while (counter < 100) {   
  24.   
  25.           System.out.println("计数 "+counter++);  //看啊,counter这个对象型的数,还能自动增加   
  26.   
  27.         }   
  28.   
  29.     }   
  30.   
  31. }    

 

 在幕后JVM已经自动执行了转换,同理Boolean和boolean之间也可以,自动拆箱装箱。但是,Integer和int毕竟还是有着不同的。

    看下面例子:

java 代码
  1. public class Test2 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.        Integer i1 = 256;   
  6.   
  7.         Integer i2 = 256;   
  8.   
  9.         if (i1 = = i2)    
  10.   
  11.         System.out.println("相等!");   
  12.   
  13.         else    
  14.   
  15.         System.out.println("不相等!");   
  16.   
  17.     }   
  18.   
  19. }    
 结果输出的是“不相等!”,两个对象比较,它们在 内存中开辟的是两个地址怎么能相等呢?

    警告:你可千万不能依赖这个结果,请把i1和i2的值,改成100.(请看Test3.java)看看什么结果,令人惊讶的是改了个数,居然输出了“相等!”。

    这是因为JVM可以选择要尝试这段代码的最佳优化,并对两个Integer对象使用一个实例,这样的话“= =”就会返回true了。在自动装箱时对于值从–128到127之间的值,使用一个实例。

    这种装箱与拆箱机制对,程序流程控制语句,也有很大影响:

java 代码
  1. public class Test4 {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.         Boolean arriving = true;   
  6.   
  7.         Integer peopleInRoom = 0;   
  8.   
  9.         int maxCapacity = 100;   
  10.   
  11.     
  12.   
  13.         while (peopleInRoom < maxCapacity) {   
  14.   
  15.           if (arriving) {   
  16.   
  17.             System.out.printf("很高兴见到你.%d号先生\n",peopleInRoom);   
  18.   
  19.             peopleInRoom++;}    
  20.   
  21.           else {   
  22.   
  23.             peopleInRoom--;   
  24.   
  25.           }   
  26.   
  27.       }}}    

另外一个从unboxing获得好处的语句是switch.在jdk5.0之前的JVM,switch接受int、short、character或者byte值,而在unboxing的操作中,你现在也可以为它赋予新引入的enum之外的Integer,Short,Char以及Byte值。Enum的值,我们在后面的教程会详细讲述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值