关于equals的讨论,大家来讨论下。

justinavril 2009-08-23 08:47:41
刚打开CSDN,一个好友发了一个短信给我,问了一个问题:

//Integer类下面的equals方法,如果这么用,会出现编译错误么?

new Integer(10).equals(10);

我觉得没啥问题嘛,因为一个Integer对象和另一个被boxing的int值比较,没有问题。但是我后来在Eclipse下面敲了一下代码:

System.out.println(new Integer(10).equals(new Integer(10)));//最原始的用法,没问题;
System.out.println(new Integer(10).equals(10));//equals里面的10被编译器auto-boxing成Integer对象,也没有问题;
System.out.println(new Integer(130).equals(11111));//为什么这个没有编译问题呢?11111已经超过了auto-boxing的范围了


然后查看Eclipse下面对于Integer类的equals方法的解释:
Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.


也都提到了两边要是同等的对象才能比较啊?难道是我脑子短路了么?
...全文
184 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzhyi21 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 frilly 的回复:]
equals 比较的是两个对象是否相等包括内存地址。

System.out.println(new Integer(130).equals(11111));//

这条语句,应该打印出false ,因为  new Integer(130)  与 new Integer(11111)//自动转换,是两个对象,值与对象的内存地址也不会相同而已.
[/Quote]


怎么能说比较的包括内存地址呢???这是不正确的,某楼上已经把Integer的源码贴出来了,他只是比较是否同一类型的两对象的属性值是否相等。
而==才是比较是否完全一致,包括内存地址和属性值
tanwen1234 2009-08-24
  • 打赏
  • 举报
回复
大家说得很清楚了,在-128~127在缓存中取数据进行auto-boxing,超过这个范围会重新new 个对象进行auto-boxing
zhuzhusany 2009-08-24
  • 打赏
  • 举报
回复
Integer对象的缓存用作是在auto-boxing的时候提高性能和节省内存空间,并不是说不在-128~127就不会执行auto-boxing了。
haojia0716 2009-08-24
  • 打赏
  • 举报
回复
如果是-128到127 用内存里现成的对象
如果不在这个范围 new Integer()
haojia0716 2009-08-24
  • 打赏
  • 举报
回复
这是jdk里Integer的源码 大家好好看看


private final int value;

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

public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
南南北北 2009-08-24
  • 打赏
  • 举报
回复
The result is true...

相等才返回真,不是不能比较啊.
小一郎 2009-08-23
  • 打赏
  • 举报
回复
学习了
dz007 2009-08-23
  • 打赏
  • 举报
回复
java的autoboxing 和 auto-unboxing
http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx

论坛某人写的,解释得很清楚
malligator 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 knightzhuwei 的回复:]
引用 4 楼 justinavril 的回复:
引用 1 楼 knightzhuwei 的回复:
auto-boxing跟常量池缓存没关系吧 只要是int范围内的整数都会自动装箱拆箱 不是一定要在-128-127之间啊

int的值在-127到128之间才被缓存的

确实是只有-127-128被缓存 但是自动装箱并不是只对有缓存的integer对象才进行啊 没被缓存的一样自动装箱 只不过没从缓存池里拿  新new了一个Integer而已
[/Quote]
只有引用的内容~
chenchengamao 2009-08-23
  • 打赏
  • 举报
回复
可以正常通过编译啊。
lh_fengyuzhe 2009-08-23
  • 打赏
  • 举报
回复
学习下
dz007 2009-08-23
  • 打赏
  • 举报
回复
如果Integer只能包装-127 - +128的数据 那也太没用了

只是在缓存范围内可以通过偏移量直接指向,而在缓存范围外要新建一个int
musecangying007 2009-08-23
  • 打赏
  • 举报
回复
???
lcj_up 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 java2000_net 的回复:]
奇怪了, 10 或者任何合法的整数,在与Integer进行操作时,都会被自动转换的!
我看你太较真了!
[/Quote]

Integer和Int可以相互转换
loveofmylife 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justinavril 的回复:]
引用 1 楼 knightzhuwei 的回复:
auto-boxing跟常量池缓存没关系吧 只要是int范围内的整数都会自动装箱拆箱 不是一定要在-128-127之间啊

int的值在-127到128之间才被缓存的
[/Quote]
当对byte, boolean,int(-127 - +128), short(-127 - +128), char(\u0000 - \u007f)在封箱时是必须进行缓存的,而对其它值,也是被允许进行缓存。
feishare 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 frilly 的回复:]
equals 比较的是两个对象是否相等包括内存地址。

System.out.println(new Integer(130).equals(11111));//

这条语句,应该打印出false ,因为  new Integer(130)  与 new Integer(11111)//自动转换,是两个对象,值与对象的内存地址也不会相同而已.
[/Quote]
对象的引用不同
knightzhuwei 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justinavril 的回复:]
引用 1 楼 knightzhuwei 的回复:
auto-boxing跟常量池缓存没关系吧 只要是int范围内的整数都会自动装箱拆箱 不是一定要在-128-127之间啊

int的值在-127到128之间才被缓存的
[/Quote]
确实是只有-127-128被缓存 但是自动装箱并不是只对有缓存的integer对象才进行啊 没被缓存的一样自动装箱 只不过没从缓存池里拿 新new了一个Integer而已
justinavril 2009-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 knightzhuwei 的回复:]
auto-boxing跟常量池缓存没关系吧 只要是int范围内的整数都会自动装箱拆箱 不是一定要在-128-127之间啊
[/Quote]
int的值在-127到128之间才被缓存的
frilly 2009-08-23
  • 打赏
  • 举报
回复
equals 比较的是两个对象是否相等包括内存地址。

System.out.println(new Integer(130).equals(11111));//

这条语句,应该打印出false ,因为 new Integer(130) 与 new Integer(11111)//自动转换,是两个对象,值与对象的内存地址也不会相同而已.
老紫竹 2009-08-23
  • 打赏
  • 举报
回复
奇怪了, 10 或者任何合法的整数,在与Integer进行操作时,都会被自动转换的!
我看你太较真了!
加载更多回复(1)

62,614

社区成员

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

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