java自动装箱和拆箱

java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱)

基本数据类型与对象的差别

基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。

基本数据类型没有可调用的方法。

eg:  int t = 1;      t.  后面是没有方法滴。

          Integer t =1; t.  后面就有很多方法可让你调用了。

自动拆箱和装箱场景

//装箱
Integer num = 10;
//拆箱
int num1 = num;

自动拆箱有个很典型的用法就是在进行运算的时候:因为对象时不恩直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除

Integer num = 10;
//进行计算时隐含的有自动拆箱
System.out.print(num--);


Integer的自动装箱

Integer i=100;  
Integer j=100;  
System.out.println(i==j);  //true  
Integer i=200;  
Integer j=200;  
System.out.println(i==j);  //false  

Integer i=100; 编译器会自动将int类型常数100包装成Interger,采用的是Integer.valueOf(100);这个方法。
当-128=<i<=127的时候,返回的是IntegerCache中的数组的值;当 i>127 或 i<-128 时,返回的是Integer类对象。

很奇怪吧:这就归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)

为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象

而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个  Integer对象

再看下面的例子:

Integer i3 = new Integer(100);
Integer i4 = new Integer(100); 
System.out.println("i3==i4: "+(i3==i4));//显示false

为什么是false呢?

只有自动装箱才会用到上面的享元模式,而new出来的对象其实是直接在堆上开辟Integer对象,不会用到享元模式中的IntegerCache中的数组的值。


参考转载自以下文章,可结合原文查看:

http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html

http://hxraid.iteye.com/blog/614440


 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值