黑马程序员技术交流社区

标题: 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