import java.util.*;
public class TestSet {
public static void main(String args[]) {
Set d = new HashSet();
//Name3 n1 = new Name3("n1");
//Name3 n2 = new Name3("n1");
//System.out.println(n1.equals(n2));
d.add(new Name3("n1"));
d.add(new Name3("n2"));
d.add(new Name3("n3"));
d.add(new Name3("n2"));//此对象无法加入,因为已经存在此对象

System.out.println(d);

}
}class Name3 {
String name;

public Name3(String name) {
this.name = name;
}

public boolean equals(Object obj) {
if(obj instanceof Name3) {
Name3 n = (Name3)obj;
if(name.equals(n.name)) {
return true;

}else return false;
}

return false;
} //必须重写hashCode
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode();
} public String toString() {
return name;
}
}
以上写法中只要name的值相同,相同对象就不能添加但我换成以下的写法,按我的理解两个new出来的对象,他们的hashCode应该是不一样的,所以我想他们应该可以都添加进去的,但结果相反,他们只添加进了一个import java.util.*;
public class TestSet {
public static void main(String args[]) {
Set d = new HashSet();
//Name3 n1 = new Name3("n1");
//Name3 n2 = new Name3("n1");
//System.out.println(n1.equals(n2));
d.add(new Name3("n1"));
d.add(new Name3(new String("n2")));
d.add(new Name3("n3"));
d.add(new Name3(new String("n2")));//此对象无法加入,因为已经存在此对象

System.out.println(d);

}
}class Name3 {
String name;

public Name3(String name) {
this.name = name;
}

public boolean equals(Object obj) {
if(obj instanceof Name3) {
Name3 n = (Name3)obj;
if(name.equals(n.name)) {
return true;

}else return false;
}

return false;
}
//必须重写hashCode
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode();
} public String toString() {
return name;
}
}
请大侠们帮忙解答一下

解决方案 »

  1.   

    这个我知道,但是只是equals后相同,但hashCode值不一样的话,这两个对象还是判断为不一样的啊
      

  2.   

    我想知道的是,为什么两个分别new出来的对象,hashCode值会不一样,hashCode的值难道不是根据内存的吗?
      

  3.   

    hashCode可以被重写,你自己处理一个规则即可。hashCode是根据什么来确定,是不好说的。
    比如说字符串,是根据字符串的值来确定的,但是其他的object是依据值吗?我不是很确定。
      

  4.   

    客气客气~
    以前我用这种方法的时候,往往是想把几个不是完全相同的对象,希望它们被Set当成是一个对象来看待,
    于是重写hashCode方法。