您的位置:首页 > 编程语言 > Java开发

java自动装箱和拆箱

2013-06-19 15:25 232 查看
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中的数组的值。

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

/article/7049404.html

/article/4462784.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: