Integer包装类问题

akqjxx 2010-03-29 03:27:39

Integer i1=3;
Integer i2=3;
System.out.println(i1==i2);

Integer i3=300;
Integer i4=300;
System.out.println(i3==i4);


输出结果是true
false

请高手们帮我解答一下,我很困惑。
...全文
147 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiyuanmiao 2010-03-29
  • 打赏
  • 举报
回复
Integer是类,不是基本数据类型,比较的时候是对象的比较,但是java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);在jdk源码中
Java代码

public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) {
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}


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);
}
}

就是Integer 建立了一个Integer 缓存对象数组cache[],对应-127-128 之间的每个值。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。
Integer i = XXX ,就是Integer i = Interger.valueOf(XXX), 首先判断XXX 是否在-127-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了,即在堆中另开辟一块内存,所以就返回false。
j_tang 2010-03-29
  • 打赏
  • 举报
回复
jvm对代码的一些优化
...... 说不定哪个版本又变化了
songyao333 2010-03-29
  • 打赏
  • 举报
回复
而且你这么比较应该用equals()方法塞
songyao333 2010-03-29
  • 打赏
  • 举报
回复
你定义成int就行了塞 你又不创建对象 用interger干嘛
pf_renren 2010-03-29
  • 打赏
  • 举报
回复
ooooooo
知道了
LuffySY 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hbgzg3006 的回复:]
java 为了速度对-128到127之间的数的自动拆装箱做了特殊处理。
[/Quote]
正确答案。
ouyangxiaokang6 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hbgzg3006 的回复:]
java 为了速度对-128到127之间的数的自动拆装箱做了特殊处理。
[/Quote]
up,超了就不好事了
hbgzg3006 2010-03-29
  • 打赏
  • 举报
回复
java 为了速度对-128到127之间的数的自动拆装箱做了特殊处理。
jimmyborton 2010-03-29
  • 打赏
  • 举报
回复
我也很费解。。。坐等高手

62,620

社区成员

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

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