黑马程序员技术交流社区

标题: 常量池问题 [打印本页]

作者: 倉促、尋找你    时间: 2014-1-12 21:46
标题: 常量池问题
                Integer i5 = 128;
                Integer i6 = 128;
                System.out.println(i5 == i6);//false
                System.out.println(i5.equals(i6));// true

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



作者: doitforyou    时间: 2014-1-12 22:12
自动装箱拆箱机制中采用了享元设计模式,只有在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);
    }
作者: xu6148152    时间: 2014-1-12 22:25
i5和i6是两个不同的对象。所以不相等,而调用equal(),比较的他们的属性是否相等。
作者: 淡夜清风    时间: 2014-1-12 22:45
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。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2