详解Java包装类及自动装箱拆箱

  

  

           基本类型   大小   包装器类型               布尔/布尔         字符   16位   布尔         字节   8位   字节         短/16位   短         int   32位   整数         长   64位   长         浮动   32位   浮动         双   64位   双         无效/无效            

  

Java的包装类有两个主要的目的:

  
      <李> Java包装类将基本数据类型的值“包”装到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向集合中添加元素(泛型的操作限制加入的只能是对象,比如列表=new ArrayList()的写法是错误的),或者从带对象返回值的方法中返回。   <李>更加方便类型的转换,如常见的整数向字符的转换
      李   
  

  

Java在SE5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换

  如:

        整数我=10;   int指数=我;      

装箱就是自动将基本数据类型转换为包装器类型
  拆箱就是自动将包装器类型装换为基本数据类型

  

在装箱的时候自动调用的是整数的返回对象的值(int)方法。而在拆箱的时候自动调用的是整数的intValue方法。

  

其他的也类似,比如翻倍,性格,不相信的朋友可以自己手动尝试一下。

  

因此可以用一句话总结装箱和拆箱的实现过程:

  

装箱过程是通过调用包装器的的方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基本数据类型)。

  

面试问题

  

下面这段代码的输出结果是什么?

        公开课主要{   公共静态void main (String [] args) {   整数i1=100;   整数i2=100;   整数i3=200;   整数预告=200;      System.out.println (i1==i2);   System.out.println (i3==预告);   }   }   之前      

注意==和=的区别:
  |类型|==|=
  | - | - - - | |
  |基本数据类型|值|不可用
  |包装类|地址|内容

  

输出的结果为:

  
  


  假

     

为什么会出现这样的结果?输出结果表明i1和i2指向的是同一个对象,而i3和预告指向的是不同的对象。此时只需一看源码便知究竟,下面这段代码是整数的的方法的具体实现:

        公共静态整数返回对象的值(int i) {   如果我在=-128,,我& lt;=IntegerCache.high)   IntegerCache返回。缓存(+ 128);   其他的   返回新的整数(i);   }   之前      

从这2段代码可以看的出,在通过的方法创建整数对象的时候,如果数值在[-128127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用,否则创建一个新的整数对象。

  

上面的代码中i1和i2的数值为100,因此会直接从缓存中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和预告则是分别指向不同的对象。

  

下面这段代码的输出结果是什么?
  

        公开课主要{   公共静态void main (String [] args) {   双i1=100.0;   双i2=100.0;   双i3=200.0;   双预告=200.0;      System.out.println (i1==i2);   System.out.println (i3==预告);   }   }   之前      

也许有的朋友会认为跟上面一道题目的输出结果相同,但是事实上却不是。实际输出结果为:

  
  


  假

     

至于具体为什么,读者可以去查看两类的返回对象的值的实现。
  在这里只解释一下为什么两类的的方法会采用与整数类的的方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

  

注意,整数,短,字节、字符,长这几个类的的方法的实现是类似的,翻倍,浮动的的方法的实现是类似的
  

  

以上所述是小编给大家介绍的Java包装类及自动装箱拆箱详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

详解Java包装类及自动装箱拆箱