黑马程序员技术交流社区

标题: Integer型引用变量赋值区别? [打印本页]

作者: 郭孟涛    时间: 2013-2-9 01:44
标题: Integer型引用变量赋值区别?
本帖最后由 张向辉 于 2013-2-10 22:46 编辑

Integer a =129,b =129;
System.out.println(a==b);
//结果:false
其中a、b为Integer型引用变量,赋的值都是129,但是两者为什么不相等?比较的是内存地址吗?
作者: qq646742615    时间: 2013-2-9 01:58
对于复杂类型 == 都是比较内存地址 基本类型才比较内容 如果要比较内容的话 应该重写 equal 和 hashCode 方法 并用equal来比较
作者: 黄金龙    时间: 2013-2-9 02:17
告诉你....-128到127之间的数字会作为常量就一个地址的值....提高复用和性能,因为小的数字使用的概率比较高....所以这些数字都会被丢在一个地方....直接引用即可....大于128的话就开辟空间存
作者: 逍林游    时间: 2013-2-9 09:25
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.
作者: 游灿平    时间: 2013-2-10 20:06
Integer a =129,b =129;
System.out.println(a==b);
首先129会被自动装箱为Integer对象,既然是对象,用==就是比较两个对象的内存地址值了啊,相当于new 了2个对象,当然内存地址值就不同了啊,所以返回false。
当然,这里还涉及到一个问题,当你声明的变量在-127~128之间就就不一样了,这时不会创建两个对象而是去常量池找,由于引用的是同一个数,地址值一样,再比较就是true了
作者: 冯佩    时间: 2013-2-10 22:46
byte类型值的范围是-128~127,在以往的版本中,每个变量都会在内存中开辟空间,都是不相等的,但在现在的新版本中为了节省空间提高复用性,对于byte取值范围内的小型数值则不再开辟空间。
作者: 黄玉昆    时间: 2013-2-10 23:31
游灿平 发表于 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
上面的朋友说的也比较清楚了。我在说说自己的理解啊。
其实说起来,这个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
希望对你有帮助啊,一定要自己总结总结哦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2