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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘克方 中级黑马   /  2012-5-15 22:57  /  2144 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                Integer i1=123;
                Integer i2=123;
                System.out.println(i1==i2);打印结果为:true
                Integer i3=432;
                Integer i4=432;
                System.out.println(i3==i4);打印结果为:false
               为什么会出现上面两种不同的结果
  

6 个回复

倒序浏览
介于-128~127之间的short和int值,会被打包到固定的对象中。注意,是固定的,也就是说堆内存中只有一个对应的包装类对象。
Integer i1=123;
Integer i2=123;
楼主的例子中,当i1被打包成123以后,堆内存中就存在了123这个Integer对象。
当下一次创建新的Integer对象时,如果是值是123,就不会再开辟新的内存空间了,只会让i2这个变量引用已产生的对象。
也就是说,此时i1和i2的指向是一样的。所以比较起来结果为true。

当值范围不在-128~127范围内时,情况就不同了。Jvm会为新创建的Integer分配新的空间。
因此,i3和i4的指向就不同了,他们分别指向各自的Integer对象,因此比较结果为false

希望这么讲你能明白。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
云惟桉 发表于 2012-5-15 23:10
介于-128~127之间的short和int值,会被打包到固定的对象中。注意,是固定的,也就是说堆内存中只有一个对应 ...

我明白了!可是为什么我查API中的Integer类型没有说明?难道这是经验?
回复 使用道具 举报
这与Java的Integer类的设计有关,你查看Java系统中java.lang.Integer类的相关代码,看到如下代码:
  static final Integer[] cache=new Integer[-(-128)+127+1];
   static{
                for(int i=0;i<cache.length;i++)
                cache[i]=new Integer(i-128)
           }
从上面看,系统把一个-128~127之间的整数自动装箱成Integer实例,并放入了一个名为cache的数组中缓存起来如果以后把一个-128~127之间的数自动装箱成一个Integer实例时,实际上是直接指向对应的数组元素,因此-128~127之间的统一个整数自动装箱后永远都是引用cache数组的同一个数组元素,所以他们相等;但每次把一个不在-128~127范围内的整数值自动装箱成Integer实例时,系统总会重新创建一个Integer实例,所以不相等。

           
回复 使用道具 举报
“Integer i1 = 127;”在JDK1.4下不能编译通过的,会提示:“ Type mismatch: cannot convert from int to Integer”的错误,一般改写为:“Integer i1 = new Integer(127);”。
“Integer i1 = 127;”在JDK1.5下可以编译通过的,这就是自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)。自动装箱(Autoboxing)特性让Java自动包装一个简单数据类型(例如int)到对应的包装类型中(例如Integer)中。
从这可以看出,“Integer i1 = 128;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(128);”。
可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。

回复 使用道具 举报
黄奕豪 发表于 2012-5-15 23:23
我明白了!可是为什么我查API中的Integer类型没有说明?难道这是经验?

呵呵,这个基础视频上老毕有说过,而且有些书上也会提及。
要记得API是给程序员和设计者提供方法和功能解析的文档,对于太细节的东西,不一定提及。
所以,多看点书,总有好处的!
回复 使用道具 举报
云惟桉 发表于 2012-5-15 23:39
呵呵,这个基础视频上老毕有说过,而且有些书上也会提及。
要记得API是给程序员和设计者提供方法和功能解 ...

嗯,看来有些东西官方不一定都有说明白的!!谢谢!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马