黑马程序员技术交流社区
标题:
【已解决】java中自动装箱与拆箱的问题
[打印本页]
作者:
黄树人
时间:
2012-9-20 17:39
标题:
【已解决】java中自动装箱与拆箱的问题
本帖最后由 黄树人 于 2012-9-22 10:58 编辑
java中提供了自动装箱和自动拆箱的功能,但用的时候出了点下错误
求高手指点下
Integer num1 = 6;
Integer num2 = 6;
System.out.println(num1 == num2);
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
复制代码
第一个打印的是true,第二个确实false,这是为什么呢
作者:
程金
时间:
2012-9-20 17:57
本帖最后由 程金 于 2012-9-20 18:16 编辑
java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式 flyweight
一般来说,一些小点的数字常量经常用到,为了加大对简单数字的重利用,节约空间,提高效率.java定义:在自动装箱时对于值从–128到127之间的值,
它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象,每次用这些数值给初始化Integer对象变量的时候,都先在常量池中查找是否已经创建过了这个数值相关联的Integer对象,没有就创建,有就将此数值相关的integer对象引用返回.
Integer num1 = 6;
Integer num2 = 6;
num1创建了一个对象,
num2并没有创建对象,而是将num1的引用直接复制给num2,所以他们指向同一个对象.
而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象,用==比较的时候,是比较他们的引用值,由于他们指向的对象不用,所以引用值不同,结果为false
明白了吧
如果你跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;
作者:
皮卫凯
时间:
2012-9-20 18:00
01.Integer num1 = 6;
02.Integer num2 = 6;
03.System.out.println(num1 == num2);
04.
05.Integer num3 = 128;
06.Integer num4 = 128;
07.System.out.println(num3 == num4)
原理是
因为num1和num2指向了同一个Integer对象。
当数值在byte范围(-128到127),对于1.50新特性,如果该数值已经存在,则不会在开辟新的空间。
其实这是享元设计模式。
而num3和num4超过范围,开辟了新的空间,就不是同一对象了。
所以
num1==num2 : true ;
num3==num4 : false 。
刚看到毕老师的,觉得挺有意思。
作者:
杨卫腾
时间:
2012-9-20 18:27
Integer num1 = 6;
Integer num2 = 6;
System.out.println(num1 == num2);
这个时候输出的是true 因为num1 和 num2 指向了同一个对象,执行Integer num2 = 6;
这个是时候就会在常量池中找到这个6, 而不再去创建新的对象。
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
自jdk1.5以后,自动装箱的是一个字节,那么该数据会被共享不会重新开辟空间。
当然常量池的数据要是超过的话,就会开辟空间, 建立新的对象,
所以输出的是false。
作者:
赵永康
时间:
2012-9-20 18:59
java的自动装箱和拆箱功,就是那个享元设计模式。就是对于那些经常用的常量存在于常量池中,为了节省内存,每次运用的时候,就不需要再去创建对象了,就直接上常量池中区寻找,有的话就直接将引用付给,没有再去创建对象。。对于基本数据类型的,因为int的范围是-128-127,java虚拟机认为就是经常用的,所以存在于常量池中。超过了就需要去创建对象,所以num3!=num4。就像String类型的一样,也存在着常量池。
我本人估计,英语的26个字母肯定存在常量池中,我们键盘录入的时候,就会直接去常量池中找,而不是每次的去创建对象。假设java的垃圾回收机制不及时的话,你的电脑会很卡的!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2