2 tangsilian tangsilian 于 2016.03.06 19:31 提问

关系多态的问题,为何重写了equals 却没有调用

import java.util.*;

class Name{
private String firstname,secondname;
public Name(String firstname,String secondname){
this.firstname=firstname;
this.secondname=secondname;

}
public String getFirstName(){return firstname;}
public String getsecondName(){ return secondname; }
public String toString(){ return firstname+" "+secondname;}

public boolean equals(Object obj) {
if(obj instanceof Name){

return true;
} return super.equals(obj);
}

public int hashcode(){
return firstname.hashCode();

}
}

public class TestCollection {

public static void main(String[] args) {
    Collection c=new HashSet();
    c.add("hello");
    c.add(new Name("uzi","omg"));
    c.add(new Integer(100));
    c.remove("hello");      
    c.remove(new Integer(100));
    System.out.println(c.remove(new Name("uzi","omg")));    
    System.out.println(c);
}

}
程序结果如下//
false
[uzi omg]

重写了Name 中的equals()结果依然没变 为何没有调用Name里的equals??

4个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.06 21:23
已采纳

之所以你的remove操作失败,是因为你重新的equals和hashCode不妥当,因为java约定equals和hashCode方法,要求equals返回true时,也一定要有相同的hashCode。
你要重写equals的话,应该用Eclipse自动生成的方法,保证这一规则成立。
删除这两个方法,重新用Eclipse的右键-》source-》generate equals() and hashCode()。选择需要用的属性,这样就能remove返回true了。
这篇文章写的很详细你可以参考下:http://www.importnew.com/16517.html

caozhy
caozhy   Ds   Rxr 2016.03.06 19:52

hashcode不同,不会调用equals,hashcode和equals的关系
如果hashcode相同,那么equals可以相同可以不同
如果hashcode不同,那么equals肯定不同。

打个比方,我们收钱,如果钱上没有水印,那么这肯定是假钱,不用继续检验了。
如果有水印,我们再用验钞机验,结果以验钞机的为准。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.06 21:29

而且你这个问题跟关系多态没有关系啊。

tangsilian
tangsilian   2016.03.06 22:00

选用myeclipse自带的generate equals() and hashCode()确实解决了问题!谢谢大家

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!