对于contains,我们应该覆盖java中的hashset的hashcode和equals

时间:2011-05-09 11:08:08

标签: java collections

  

可能重复:
  Overriding equals and hashCode in Java

对于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();    
    }    
}

6 个答案:

答案 0 :(得分:3)

我没有看到关于这个问题的任何细节,但是,你应该覆盖hashCode()和equals()来正确比较集合的对象。

答案 1 :(得分:1)

如果您覆盖 hashCodeequals,则必须覆盖它们。它在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")不同,则不必覆盖equalshashCode,因为默认实现在这种情况下已经正常工作。