请高手指教

poseidon1987 2008-10-05 12:37:45
public class TestWrap {
public static void main (String[] args) {
Integer i1 = 100;
Integer i2 = 100;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");

Integer i3 = 200;
Integer i4 = 200;
if (i3 == i4)
System.out.println("i3 == i4");
else
System.out.println("i3 != i4");

Integer i5 = 200;
Integer i6 = 200;
if (i5.equals(i6))
System.out.println("i5 == i6");
else
System.out.println("i5 != i6");

}
}

运行结果:

i1 ==i2

i3!=i4

i5==i6
其中i3!=i4不明白,请高手指点。
...全文
82 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
-box- 2008-11-27
  • 打赏
  • 举报
回复
学习了
zhangzuohai 2008-11-27
  • 打赏
  • 举报
回复
学问就在平凡当中!
hitzsf 2008-10-06
  • 打赏
  • 举报
回复
为什么i5==i6呢?
loaferwang 2008-10-06
  • 打赏
  • 举报
回复
真的学习啦,一道如此平民化的题,居然如此了得!应该加精呀!
chenpingtai2008 2008-10-06
  • 打赏
  • 举报
回复
学习了。
sunxing007 2008-10-05
  • 打赏
  • 举报
回复
java在编译的时候 Integer a = 100; 被翻译成 Integer a = Integer.valueOf(100);
比较的时候仍然是对象的比较
在jdk源码中
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);
}
再看IntegerCache :
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache = new Integer(i - 128);
}
}
这边是java为了提高效率,初始化了-128--127之间的整数对象
horizonlyhw 2008-10-05
  • 打赏
  • 举报
回复
在网上找了个现成的解释~~ (引用此位牛人的解释)

Java Integer对象大家应该都不陌生吧,今天我们就一起来探讨一下。
Integer i1 = 10;
Integer i2 = 10;
System.out.println(i1 == i2);

Integer a1 = 128;
Integer a2 = 128;
System.out.println(a1 == a2);
打印结果是true和false,至于为什么看了Integer源代码后就能明白,Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。
至于上面的代码经过编译后就变成了
Integer i1 = Integer.valueOf(10);
Integer i2 = Integer.valueOf(10)
System.out.println(i1 == i2);

Integer a1 = Integer.valueOf(128)
Integer a2 = Integer.valueOf(128)
System.out.println(a1 == a2);

看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为128时,每次都是不同的对象。
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);
}
顺带一提,我用的JDK 1.5,若在1.4环境下Integer i1 = 10; 这种写法会报错,
必须改为Integer i1 = new Integer(10); 这是因为1.5的自动装箱特性。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧