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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志彬 中级黑马   /  2014-1-7 09:47  /  1100 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   Integer num1=12;
                Integer num2=12;
                System.out.println(num1==num2);                                //true
               
                Integer num3=129;
                Integer num4=129;
                System.out.println(num3==num4);                                //false

这是怎么回事?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 享元、常量池。

查看全部评分

4 个回复

倒序浏览
对于这些基本类型的整数,要装箱成为Integer对象的时候, 如果这些数据在1个字节之内,-128~127之内的数字,一旦把这些包装成Integer对象的时候 就会把这个数据缓存起来,缓存在一个池里面,下次又要把一个整数装成Integer对象的时候, 先去看缓存池里面有没有,有的话直接在池里面拿,这样节省了内存空间的使用, jdk认为,这些的小的整数出现的频率会很高,这个对象本来就是不怎么改变的, 对象又很小,没必要每一个数字都要new一个对象,这是一个设计模式,这叫享元模式。(Flyweight)

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.5版本的新特效 自动拆箱装箱 如果Integer类型的数值在byte类型-128~127之间 就会返回true 否则返回false
回复 使用道具 举报
本帖最后由 猎鹰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】,不缓存,直接来一新对象
     


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
==这个符号其行为是比较地址值得,而不是对象的内容,而且上面是一个对象,自然相等,下面是两个对象,其首地址自然不等
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马