关于Integer m经过 m--运算后的问题

jiaxinyuck110 2008-06-08 02:12:30
今天看到了一个别人的提问,想起来一个问题来希望大家帮忙解决一下
Integer m = new Integer(2);
Integer n = new Integer("2");
System.out.println(m==n);
System.out.println(m.equals(n));
结果为:false true

m--; //是不是经过运算对象m,n都指向同一个‘1’地址的引用了。具体原理是什么?怎么变化的?希望大家指导一下!
n--;

System.out.println(m==n);
System.out.println(m.equals(n));
结果为true true;
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
现在这个问题我终于明白了。感谢你的回答!
sagezk 2008-06-08
  • 打赏
  • 举报
回复

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[i] = new Integer(i - 128);
}
}


IntegerCache 是一个内部类,除了静态块外只有一个公有静态 Integer 数组 cache,其中每个元素引用着 Integer(-128) 到 Integer(127) 之间的一个Integer对象,return IntegerCache.cache[i + offset]; 的作用是从中找到与 valueOf(int i) 中参数 i 对应的 Integer 对象并返回它的引用。
jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
 return IntegerCache.cache[i + offset];  //缓存处理
这句代码不是很明白能否详细说明一下
jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
return IntegerCache.cache[i + offset];
//这句代码不是十分明白楼上能否详细说明一下!
sagezk 2008-06-08
  • 打赏
  • 举报
回复
汗!差点误人子弟。
sagezk 2008-06-08
  • 打赏
  • 举报
回复
更正一下:

m-- 和 n-- 相当于:

int tm = m.intValue();
tm--;
m = Integer.valueOf(tm);
int tn = n.intValue();
tn--;
n = Integer.valueOf(tn);


再结合:

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


jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
感谢sagezk 您的解释很透彻!谢谢您的回答!
jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yami251139 的回复:]
对象是2个,但是再那个什么里面引用的地址是同一个
就这么回事
[/Quote]
我知道引用是一个,开始的引用是不同为什么经过M--;N--;引用就是一个了;这是我的问题的关键
sagezk 2008-06-08
  • 打赏
  • 举报
回复
先来解释一下
Integer m = new Integer(2);
Integer n = new Integer("2");
m--;
n--;

Integer 类的构造方法源代码如下:
    private final int value;  //用于保存被包装进Integer对象中的整数

public Integer(int value) {
this.value = value;
}

public Integer(String s) throws NumberFormatException {
this.value = parseInt(s, 10); //用字符串解析成的整数初始化value
}

public int intValue() {
return value;
}

前两行分别创建了两个包装有整数2的Integer对象并分别交给m,n引用着。
后两行使用了自动包装和自动解包机制(也叫自动装箱自动拆箱,英文原术语应该是autowrapping),
这里 m-- 和 n-- 相当于:

int tm = m.intValue();
tm--;
m = new Integer(tm);
int tn = n.intValue();
tn--;
n = new Integer(tn);

但要注意,这里只是相当于,按照自动打包规范描述,当自动包装发生时为了优化性能,对于在-128~127之间的int类型整数值会被包装到相同的对象中,可以用下面代码验证:

public class AutoWrapping {

public static void main(String[] args) {
Integer i = 100;
Integer j = 100;
System.out.println(i == j);
Integer m = 129;
Integer n = 129;
System.out.println(m == n);
}
}

输出是 true false。
而上面 m-- 和 n-- 执行时就是这种情况。
各位应该明白了吧!

dracularking 2008-06-08
  • 打赏
  • 举报
回复
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);
}
yami251139 2008-06-08
  • 打赏
  • 举报
回复
对象是2个,但是再那个什么里面引用的地址是同一个
就这么回事
jiaxinyuck110 2008-06-08
  • 打赏
  • 举报
回复
自己做个沙发

62,615

社区成员

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

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