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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 倉促、尋找你 中级黑马   /  2014-1-12 21:46  /  882 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                Integer i5 = 128;
                Integer i6 = 128;
                System.out.println(i5 == i6);//false
                System.out.println(i5.equals(i6));// true

这里i5==i6 为什么是false?不是指向同一个128吗?128这个数在内存中存储位置是在哪?有点疑惑,求大神指点下。谢谢


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

3 个回复

倒序浏览
自动装箱拆箱机制中采用了享元设计模式,只有在byte范围的数字位于常量池中,即-128至127,
在此范围内的数值由于使用比较频繁,所以采用了享元设计模式。128是超出临界点的数值,
所以地址值比较是false,自动装箱的时候创建在了堆内存中。给你提供一段源码,你就明白了:
public static Integer valueOf(int i) {
        final int offset = 128;
        if (i >= -128 && i <= 127) { // must cache
            return IntegerCache.cache[i + offset];
        }
        return new Integer(i);
    }

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
榨菜 + 2 很给力!
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
i5和i6是两个不同的对象。所以不相等,而调用equal(),比较的他们的属性是否相等。
回复 使用道具 举报
Integer i5 = 128;
Integer i6 = 128;
i5,i6是两个不同的Integer对象的引用,他们指向的是两块不同的区域。怎么可能相等呢?所以返回false
-------------------
Integer这个类重写了它的父类Object类的equals方法。查看Integer的equals方法具体的API文档。
public boolean equals(Object obj)比较此对象与指定对象。
---当且仅当参数不为 null,并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。

i5,i6都包含相同的int值128。所以结果返回true。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马