A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄树人 于 2012-9-22 10:58 编辑

java中提供了自动装箱和自动拆箱的功能,但用的时候出了点下错误
求高手指点下
  1. Integer num1 = 6;
  2. Integer num2 = 6;               
  3. System.out.println(num1 == num2);

  4. Integer num3 = 128;               
  5. Integer num4 = 128;
  6. System.out.println(num3 == num4);
复制代码
第一个打印的是true,第二个确实false,这是为什么呢

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 装饰设计模式!好好看看视频

查看全部评分

4 个回复

倒序浏览
本帖最后由 程金 于 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就都一个新的对象;

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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 。
刚看到毕老师的,觉得挺有意思。
回复 使用道具 举报
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。

回复 使用道具 举报
java的自动装箱和拆箱功,就是那个享元设计模式。就是对于那些经常用的常量存在于常量池中,为了节省内存,每次运用的时候,就不需要再去创建对象了,就直接上常量池中区寻找,有的话就直接将引用付给,没有再去创建对象。。对于基本数据类型的,因为int的范围是-128-127,java虚拟机认为就是经常用的,所以存在于常量池中。超过了就需要去创建对象,所以num3!=num4。就像String类型的一样,也存在着常量池。
我本人估计,英语的26个字母肯定存在常量池中,我们键盘录入的时候,就会直接去常量池中找,而不是每次的去创建对象。假设java的垃圾回收机制不及时的话,你的电脑会很卡的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马