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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭孟涛 高级黑马   /  2013-2-9 01:44  /  2348 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-10 22:46 编辑

Integer a =129,b =129;
System.out.println(a==b);
//结果:false
其中a、b为Integer型引用变量,赋的值都是129,但是两者为什么不相等?比较的是内存地址吗?

评分

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

查看全部评分

7 个回复

倒序浏览
对于复杂类型 == 都是比较内存地址 基本类型才比较内容 如果要比较内容的话 应该重写 equal 和 hashCode 方法 并用equal来比较

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6

查看全部评分

回复 使用道具 举报
告诉你....-128到127之间的数字会作为常量就一个地址的值....提高复用和性能,因为小的数字使用的概率比较高....所以这些数字都会被丢在一个地方....直接引用即可....大于128的话就开辟空间存

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
Integer a =129,b =129;
这里涉及到int到Integer的自动装箱功能,129是int型,将129装箱成Integer型即:new Integer(129),然后让a指向Integer(129)。b同理。
所以Integer a =129,b =129;等价于Integer a =new Integer(129),b =new Integer(129)。
==>  a、b不同的首地址 ==>  System.out.println(a==b);   ==>  false.

评分

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

查看全部评分

回复 使用道具 举报
Integer a =129,b =129;
System.out.println(a==b);
首先129会被自动装箱为Integer对象,既然是对象,用==就是比较两个对象的内存地址值了啊,相当于new 了2个对象,当然内存地址值就不同了啊,所以返回false。
当然,这里还涉及到一个问题,当你声明的变量在-127~128之间就就不一样了,这时不会创建两个对象而是去常量池找,由于引用的是同一个数,地址值一样,再比较就是true了

评分

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

查看全部评分

回复 使用道具 举报
byte类型值的范围是-128~127,在以往的版本中,每个变量都会在内存中开辟空间,都是不相等的,但在现在的新版本中为了节省空间提高复用性,对于byte取值范围内的小型数值则不再开辟空间。
回复 使用道具 举报
黄玉昆 黑马帝 2013-2-10 23:31:17
7#
游灿平 发表于 2013-2-10 20:06
Integer a =129,b =129;
System.out.println(a==b);
首先129会被自动装箱为Integer对象,既然是对象,用== ...

我测试了你说的意思,我觉得那个范围有点不对吧,应该是-128 ~ 127才对吧。这-128取得到,但是128取不到。确切说是【-2的7次方,2的7次方-1】
回复 使用道具 举报
黄玉昆 黑马帝 2013-2-10 23:44:59
8#
上面的朋友说的也比较清楚了。我在说说自己的理解啊。
其实说起来,这个Integer和int的关系有点像String和StringBuilder的关系。
java为了优化内存,提高性能,就单开了一片内存池(pool),也就是说,在这里共享了那些固定不变的数据(我个人理解啊),如数字和字符串等等,这也是一种对象。
重点说Integer和int,在内存池中定义他们的范围是-128 ~ 127,这里的数十共享的,其实共享的是地址,就是变量指向的地址。(题外话:变量其实都是指向的地址,地址才是代表一块内存的空间的。)
是java为了提高效率,初始化了-128--127之间的整数对象,所以,你写Integer a =100的话,是在内存池中创建了一个变量为a的对象,再写b=100,就共享了100这个数据,其实是指向了相同地址。
但是你超过了这个范围的话,这数据就不是共享的了,指向的不是相同地址。所以就不想等了。你可以看看这篇文章:
http://hi.baidu.com/next2_me/item/128f29c36b2fc6320931c6f7
和关于String中比较的内容:
http://blog.csdn.net/shengfeixiang/article/details/8577842
希望对你有帮助啊,一定要自己总结总结哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马