关于地址比较的问题

chjwin 2009-12-15 08:15:25
写出以下代码的运行结果并说明理由
public class Test{
public static void main(String[] args){
Integer m = new Integer(128);
Integer n= new Integer(128);
System.out.println(m == n);
System.out.println(m.equals(n));
m--;
n--;
System.out.println(m == n);
System.out.println(m.equals(n));
}
}

结果为
false
true
true
true

不明白的地方唯独是m和n--后 m == n 为什么是true???
...全文
57 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
silencexk212112 2009-12-17
  • 打赏
  • 举报
回复
来学习学习...
不叫月红 2009-12-17
  • 打赏
  • 举报
回复
public class Test{
public static void main(String[] args){
Integer m = new Integer(128);
Integer n= new Integer(128);
System.out.println(m == n); //比较的是m和n的地址,m和n是两个不同的对象
System.out.println(m.equals(n)); //这里比较的是m和n的值
m--; //此时m的数据类型为int型
n--; //此时n的数据类型为int型
System.out.println(m == n);
System.out.println(m.equals(n));
}
}
所以结果是是那样的。
Bleibo 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cczdp 的回复:]
这里是由于自动拆包和加包得过程,
当执行m--时,m不是Integer对象,而是int简单类型,
同样n--也是,这时再用m==n,则相等。
两个对象用==比较时,只要不是同一个引用,总不相等。
[/Quote]
在jdk1.5版本,它支持了自动包装和解包操作,对于bool/Boolean,byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包操作都进行了支持
Landor2004 2009-12-15
  • 打赏
  • 举报
回复
这是java虚拟机的优化,以前也有类似的帖子
看这里的解释吧
http://www.blogjava.net/zhaochengming/archive/2007/08/13/136468.html
cczdp 2009-12-15
  • 打赏
  • 举报
回复
这里是由于自动拆包和加包得过程,
当执行m--时,m不是Integer对象,而是int简单类型,
同样n--也是,这时再用m==n,则相等。
两个对象用==比较时,只要不是同一个引用,总不相等。

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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