个人见解,欢迎拍砖:eqluals和"=="的区别

xiaoyi3317 2009-12-12 10:55:56
无论是看ppt或者网上的观点,大多对这两者是这样说的,equals是比较内容,而"=="是指地址。。前些天,复习j2se的东西,看了一下源码,才有些理解了,不知道对不对,欢迎大家的指正。。
  这两个其实是相同的。。在Object那个类里面equals方法是这样写的:
  代码如下
   public boolean equals(Object obj) {
return (this == obj);
  }
  也就是说返回的是当前对象,如果不重写toString方法,那么它的值肯定是一个地址,与"=="是没啥区别的。。
  那么为什么说equals是比较内容呢?我估计是因为String。。
  有这样一个例子:
String a=new String("abc");
String b=new String("abc");
System.out.println(a.equals(b));//也许在这里是被认为内容相同,他们在比较内容。。
  我查看了一下String里面的equals方法,它是重写Object的equals方法了,代码如下:
   public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
  这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!
...全文
208 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerry_hr1 2009-12-12
  • 打赏
  • 举报
回复
顶了,说的对
coolbamboo2008 2009-12-12
  • 打赏
  • 举报
回复
帮顶了
xiaoyi3317 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bobo364 的回复:]
其实这么设计的目的很明确,就是用!=来代替==的逻辑上的判断,equals本来的目的就是判断是否同一,而判断相等可以令写方法
[/Quote]
嗯。。你说的对。。
bobo364 2009-12-12
  • 打赏
  • 举报
回复
其实这么设计的目的很明确,就是用!=来代替==的逻辑上的判断,equals本来的目的就是判断是否同一,而判断相等可以令写方法
cweijiaweil 2009-12-12
  • 打赏
  • 举报
回复
java_running 2009-12-12
  • 打赏
  • 举报
回复
啥也不想说,就看看,帮顶...
frank3G 2009-12-12
  • 打赏
  • 举报
回复
你说的对
J10FX 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 xiaoyi3317 的回复:]
    无论是看ppt或者网上的观点,大多对这两者是这样说的,equals是比较内容,而"=="是指地址。。前些天,复习j2se的东西,看了一下源码,才有些理解了,不知道对不对,欢迎大家的指正。。
  这两个其实是相同的。。在Object那个类里面equals方法是这样写的:
  代码如下
    public boolean equals(Object obj) {
return (this == obj);
    }
  也就是说返回的是当前对象,如果不重写toString方法,那么它的值肯定是一个地址,与"=="是没啥区别的。。
  那么为什么说equals是比较内容呢?我估计是因为String。。
  有这样一个例子:
    String a=new String("abc");
    String b=new String("abc");
    System.out.println(a.equals(b));//也许在这里是被认为内容相同,他们在比较内容。。
  我查看了一下String里面的equals方法,它是重写Object的equals方法了,代码如下:
    public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
    if (v1[i++] != v2[j++])
return false;
}
return true;
    }
}
return false;
    }
  这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!

[/Quote]
经典
princess_rosie 2009-12-12
  • 打赏
  • 举报
回复
呵呵
williamxiao 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 rubbysnow 的回复:]
从API上得出的结论,
(1)Object 是所有类的基类,Object中的equals方法和==是一样的意思,都是比较地址所指向对象。
(2)String等重写了equals方法,使得equals和==有了不一样的意思,即equals比较的是String对象的值,==比较的是String对象的地址。
结论就是,对于重写了Object中equals方法的类来说,equals可能和==有不一样的意思。对于没有重写Object中equals方法的类来说,equals完全和==表达一样的意思,即比较引用地址。
[/Quote]
API中说得比较明白.
jack_wub 2009-12-12
  • 打赏
  • 举报
回复
嗯,是这样的,我也总结过,和你想的差不多
godismydaughter 2009-12-12
  • 打赏
  • 举报
回复
学习了。好系统的分析。
xiaoyi3317 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wyhack 的回复:]
这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!

[/Quote]
WYhack 2009-12-12
  • 打赏
  • 举报
回复
这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!
xiaoyi3317 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 rubbysnow 的回复:]
从API上得出的结论,
(1)Object 是所有类的基类,Object中的equals方法和==是一样的意思,都是比较地址所指向对象。
(2)String等重写了equals方法,使得equals和==有了不一样的意思,即equals比较的是String对象的值,==比较的是String对象的地址。
结论就是,对于重写了Object中equals方法的类来说,equals可能和==有不一样的意思。对于没有重写Object中equals方法的类来说,equals完全和==表达一样的意思,即比较引用地址。
[/Quote]
与我得出来的结论相同,不过谢谢你的总结,让其他人可以受益!!
rubbysnow 2009-12-12
  • 打赏
  • 举报
回复
从API上得出的结论,
(1)Object 是所有类的基类,Object中的equals方法和==是一样的意思,都是比较地址所指向对象。
(2)String等重写了equals方法,使得equals和==有了不一样的意思,即equals比较的是String对象的值,==比较的是String对象的地址。
结论就是,对于重写了Object中equals方法的类来说,equals可能和==有不一样的意思。对于没有重写Object中equals方法的类来说,equals完全和==表达一样的意思,即比较引用地址。
chenchengamao 2009-12-12
  • 打赏
  • 举报
回复
呵呵。。。。
yang677888 2009-12-12
  • 打赏
  • 举报
回复
看看
xiaoyi3317 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 realreachard 的回复:]
看看java模式,讨论了很多类似问题
equals , clone,等等的
[/Quote]
没看这本书,对我影响比较大的恐怕就是thinking in java了,呵呵~我一直觉得代码是敲出来的,网上说多听视频,当然也对。。
realreachard 2009-12-12
  • 打赏
  • 举报
回复
看看java模式,讨论了很多类似问题
equals , clone,等等的
加载更多回复(1)

62,623

社区成员

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

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