黑马程序员技术交流社区
标题:
Integer 提问
[打印本页]
作者:
周志彬
时间:
2014-1-7 09:47
标题:
Integer 提问
Integer num1=12;
Integer num2=12;
System.out.println(num1==num2); //true
Integer num3=129;
Integer num4=129;
System.out.println(num3==num4); //false
这是怎么回事?
作者:
a844468138
时间:
2014-1-7 10:08
对于这些基本类型的整数,要装箱成为Integer对象的时候, 如果这些数据在1个字节之内,-128~127之内的数字,一旦把这些包装成Integer对象的时候 就会把这个数据缓存起来,缓存在一个池里面,下次又要把一个整数装成Integer对象的时候, 先去看缓存池里面有没有,有的话直接在池里面拿,这样节省了内存空间的使用, jdk认为,这些的小的整数出现的频率会很高,这个对象本来就是不怎么改变的, 对象又很小,没必要每一个数字都要new一个对象,这是一个设计模式,这叫享元模式。(Flyweight)
作者:
黄晓鑫
时间:
2014-1-7 12:11
1.5版本的新特效 自动拆箱装箱 如果Integer类型的数值在byte类型-128~127之间 就会返回true 否则返回false
作者:
猎鹰tianya
时间:
2014-1-7 14:23
本帖最后由 猎鹰tianya 于 2014-1-7 14:27 编辑
这个问题,我今天已经纠结了一天了,也是刚弄懂!在Integer里有个内部类IntegerCache,会对【-128到127】的Integer对象进行缓存,这个你看Integer源码就能知道了!
我的解释是这样的:
Integer num1=12;
// 这里用到了传说中的自动装箱, 这个动作会创建一个一个Integer对象并将地址覆盖num1,由于这个值在【-128到127】范 围内,所以会对这个对象进行缓存
Integer num2=12;
// 这个值得范围也在【-128到127】,这时,不会先创建一个对象,而是先去缓冲区找了,要是没找到才创建新的,要是找到了,就直接一个指向就完了!也就是说,这里的num1和num2其实是指向一个对象的,这就不难解释为什么用==比较的时候 是true了,因为两个地址是同一个地址。
System.out.println(num1==num2);
//true
Integer num3=129;
//范围超过【-128到127】,不缓存,直接来一新对象
Integer num4=129;
//范围超过【-128到127】,不缓存,直接来一新对象
作者:
mrwise1991
时间:
2014-1-14 19:36
==这个符号其行为是比较地址值得,而不是对象的内容,而且上面是一个对象,自然相等,下面是两个对象,其首地址自然不等
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2