黑马程序员技术交流社区
标题:
常量池问题
[打印本页]
作者:
倉促、尋找你
时间:
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