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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 巩彪 初级黑马   /  2012-8-19 14:31  /  1789 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7==i8); //false
System.out.println(i7.equals(i8)); //true

为什么i7==i8 是错误的呢?不都是128吗??

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

2 个回复

倒序浏览
java中认为一个数据,如果是用一个byte能够表示的,为了节省内存空间,它就是使用的是同一个数据。
在byte能够表示的范围内,数据可以想象成是存储在一个byte的常量池里面。128超过byte范围,所以i7==i8是错的.

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
我是这样理解的,Integer是封装类型,是类,是对象,
如:Integer i7 = 128;是在栈内存中创建了i7这个对象引用的变量,而在堆内存中开辟了存放128的内存
而,Integer i8 = 128在栈内存中又创建了i8这个对象引用的变量,而在堆内存中又开辟了存放128的内存
这样看来,i7和i8中存储的堆内存地址不一样,当然就i7==i8就是false了。
扩展,字符串的话,在这个地方有个优化,就是有字符串池,就是如果之前定义了一个字符串的话,字符串池中没有这个值的话,这个值就会放到字符串池中,当再有字符串定义这个值时,会自动调用字符串池中的相应的值,没有的话再放入字符串值,以此类推;
如图

未命名.jpg (52.75 KB, 下载次数: 35)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

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