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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑马 黑马帝   /  2012-9-3 09:50  /  2896 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马小龙 于 2012-9-3 12:23 编辑

求输出结果:
    /**
     *  
     * @author
     */
    public class IntegerTest {
        public static void main(String[] args) {     
            objPoolTest();
        }
     
        public static void objPoolTest() {
            Integer i1 = 40;
            Integer i2 = 40;
            Integer i3 = 0;
            Integer i4 = new Integer(40);
            Integer i5 = new Integer(40);
            Integer i6 = new Integer(0);
            
            System.out.println("i1=i2\t" + (i1 == i2));   
            System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));
            System.out.println("i4=i5\t" + (i4 == i5));
            System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));     
            
            System.out.println();         
        }
    }

输出结果:
i1=i2 true     
i1=i2+i3 true
i4=i5 false
i4=i5+i6 true 看起来比较Easy的问题,但是Console输出的Result和我们所想的确恰恰相反,有点疑惑了,这是为什么咧?请大牛详细说明每一个比较结果其中的原理




评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 多多加油!

查看全部评分

8 个回复

倒序浏览
java的常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量外,还包含一些文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法和名称的描述符()---红色部分不是太懂,了解的话麻烦下哈!
你可能把Integer和int弄混了,Integer是int的封装类,也就是说Integer对象中存在int字段!
   System.out.println("i1=i2\t" + (i1 == i2));   //栈中的数据引用了常量池中的数据,他们的引用地址相同,所以true   
            System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));  /; i3+i2 指向常量池中的40,他们的引用地址相同,所以true
         
            System.out.println("i4=i5\t" + (i4 == i5));//
            
     /*  所以上面代码中的
          Integer i4 = new Integer(40);
          Integer i5 = new Integer(40);
     因为常量池中应经有了40,所以在堆中分别创建了一个对象(注意比较的是堆中的地址),指向常量池中同一的位置,但i4和i5的引用堆地址不同,所以fals
   
*/
  System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));   //true  i5+i6 对应40的地址即常量池中40的位置,所以true

无标题.png (17.03 KB, 下载次数: 42)

内存中的示意图

内存中的示意图

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
刘芮铭 + 1 赞一个!图文并茂
小黑马 + 10 明白了

查看全部评分

回复 使用道具 举报
本帖最后由 路易斯威登吕 于 2012-9-3 11:09 编辑

如示例所示:
Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
定义i1,i2,i3等于常量,完成后直接存在于栈内存中,所以i1=i2 true ,i1=i2+i3 true
i4,i5,i6为引用数据类型,定义后,i4指向new Integer(40)的内存地址,i5i6也都是指向的一个内存地址,
由于内存地址的唯一性,所以i4=i5 false,但是i5+i6 结果是对应堆内存两个值相加的结果即40;i4=i5+i6相当于i4=40是正确的,楼主可以加一句:System.out.println("i4=i5+i6=40\t" + (i4 == 40));  以证明结果的正确性。


示例.jpg (23.6 KB, 下载次数: 43)

示例.jpg
回复 使用道具 举报
i4 == i5+i6, 由于优先级问题 先运算i5 + i6  ,因为java具备自动装箱拆箱,底层会转成int类型,然后再与i4才能比较,i4同样也要转成int类型比较,结果为true。
回复 使用道具 举报
学习了~~~ 大家都很强啊
回复 使用道具 举报
路易斯威登吕 发表于 2012-9-3 11:03
如示例所示:
Integer i1 = 40;
Integer i2 = 40;

麻烦你去改下名字,要么是不会给你加分的,
回复 使用道具 举报
王德升 发表于 2012-9-3 12:16
麻烦你去改下名字,要么是不会给你加分的,

版主辛苦了,我去改名专区改名字时,苏老师告诉我QQ号登陆的改不了,所以我只能用我的真实姓名重新注册了一个号,我名字是:吕书凯,请版主可否将技术分转到我的新账号上,谢谢,不然以前的都废掉了。
回复 使用道具 举报
吕书凯 发表于 2012-9-3 13:30
版主,这是我新注册的号,请加分到新号上,可否?

亲 你你要问滔 或者小苏老师,

你有加群吗,?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马