对于contains,我们应该覆盖hashcode中的hashcode和equals吗?
import java.lang.Math;
import java.util.HashSet;
class Hello{
public String name= "";
Hello(String name){
this.name = name;
}
public static void main(String args[]){
Hello h1 = new Hello("first");
Hello h2 = new Hello("second");
Hello h3 = new Hello("third");
Hello h4 = new Hello("fourth");
Hello h5 = new Hello("fourth");
HashSet hs = new HashSet();
hs.add(h1);
hs.add(h2);
hs.add(h3);
hs.add(h4);
hs.add(h5);
hs.add(h5);
hs.add(null);
System.out.println("elements in hashset"+hs);
// System.out.println("elements in hashset"+hs.contains());
System.out.println("elements in hashset"+hs.contains(new Hello("fourth")));
}
/*public boolean equals(Object obj){
System.out.println(name+"==========="+((Hello)obj).name);
if(name.equals(((Hello)obj).name))
return true;
else
return false;
}*/
public int hashCode(){
return name.hashCode();
}
}
答案 0 :(得分:3)
我没有看到关于这个问题的任何细节,但是,你应该覆盖hashCode()和equals()来正确比较集合的对象。
答案 1 :(得分:1)
如果您覆盖 hashCode
或equals
,则必须覆盖它们。它在java.lang.Object
的Javadocs中说,这绝对是真的。
答案 2 :(得分:0)
是的你的Hello类只是包装一个String,但你必须覆盖hashCode并在Hello中等于。
答案 3 :(得分:0)
是
由于HashSet.contains
使用containsKey
使用getEntry
。它试图在哈希中找到键值对,并且需要两种方法(一种用于选择桶,另一种用于查看内部桶列表)。
答案 4 :(得分:0)
如果您希望将两个不同的对象视为相等,则需要覆盖等于。如果使用哈希集合,则需要覆盖hashCode()以相同的方式工作。
System.out.println("elements in hashset"+hs.contains(h4); // displays true.
答案 5 :(得分:0)
顺便说一下,如果所有Hello
个对象都被认为是不同的(例如,一个new Hello("first")
应被视为与下一个new Hello("first")
不同,则不必覆盖equals
或hashCode
,因为默认实现在这种情况下已经正常工作。