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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kevinmesss.tz 中级黑马   /  2014-2-6 12:34  /  1421 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kevinmesss.tz 于 2014-2-7 16:40 编辑

Integer m = 128 ;Integer n = 128 ;m==n 为false因为是两个对象所以内存地址不同
Integer a = 127 ; Integer b = 127 ;  a==b为true  因为数值在byte范围内就会从常量池中去 而不开辟新空间
那么为什么
Integer x = new Intefer("123") ;
Integer y = new Intefer(123) ;
x==y却是false    123小于128应该在常量池中的啊
(x,y一个构造函数有"" 一个没有 有什么区别)

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 新年快乐!同学~

查看全部评分

3 个回复

倒序浏览
凡是用new关键字创建对象时,都是在堆内存中创建一个全新的对象并赋于一个全新的地址值,与常量池无关。Integer a = 128与Integer x = new Intefer("123")不同的是Integer a = 128在jdk1.5以后有一个自动装箱的动作,在底层自动new Intefer("128")创建对象并把地址值付给a引用。但底层为了节省内存空间,执行自动装箱的动作时会判断是否是常用数据,如果是常用数据并且在常量池中没有该数据的对像,在常量池中创建对象并把地址值赋给引用变量,如果常量池中存在该常用数据的对象,就直接把地址值赋给引用变量了,而不需要再次创建了,节省了内存空间。
回复 使用道具 举报
补充一点就是Integer a = 128自动装箱涉及到底层的操作,而Integer x = new Intefer("123")不涉及到底层操作,与常量池也就没有任何关系
回复 使用道具 举报
quan23355 发表于 2014-2-7 01:14
补充一点就是Integer a = 128自动装箱涉及到底层的操作,而Integer x = new Intefer("123")不涉及到底层操 ...

理解了!谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马