2012-03-08 160 views
-1

我不清楚使用哈希码的和等于在java.I方法有以下查询重写哈希码,等于在java中

首先

如果我只覆盖equals方法值弗雷德的所有对象都添加尽管HashSet实现了设置界面,但不能重复使用值。

如果我重写了equals和hashCode只有一个对象被添加到HashSet.Why?

第三 如果我在这种情况下只实现等于将删除一个Fred对象将删除所有?

class Person 
{ 
    String name; 
    Person(String name) { 
     this.name=name; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if(!(obj instanceof Person)) 
     { 
     return false; 
     } 
    Person p = (Person)obj; 
    return p.name.equals(this.name); 
     } 


    /*@Override 
    public int hashCode() { 
     return name.hashCode(); 
    }*/ 
} 

public class HashSetDemo { 

    /* 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     HashSet<Person> s= new HashSet<Person>(); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred")); 
     s.add(new Person("Fred1")); 
     for(Person a:s) { 
      System.out.println(a.name); 
     } 

     s.remove(new Person("Fred")); 
     System.out.println(s); 
    } 
} 
+2

这看起来很像功课。如果是这样,请将其标记为。 – Viruzzo 2012-03-08 14:55:36

+0

@prerna广泛的解释检查这个http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – hidralisk 2012-03-08 15:07:21

回答

1

从 “有效的Java” 由Joshua布洛赫,第9项:

你必须在每一个覆盖equals类中重写hashCode如果不这样做将导致违反Object.hashCode的一般合同,这将阻止您的课程与所有基于哈希的馆藏(包括HashMap,HashSetHashtable)一起正常运行。

Eclipse IDE将为您生成hashCodeequals方法。

大多数hashCode方法看起来是这样的:

public int hashCode() { 
    int result = 17; 
    result = 31 * result + field1; (int) 
    result = 31 * result + field2.hashCode(); (Object) 
    ... for the rest of the fields. 
    return result; 
} 
3

的问题与你的equals方法是this.name == emp.name此检查两个字符串指向你应该使用equals代替this.name.equals(emp.name)相同的内存。这将解决你的第一个问题。

hashCode方法告诉你如何转换为hashCode。由于您的hashCode等于名称的hashCode,因此所有的Freds都具有相同的hashCode因此,它们全都覆盖HashSet中的每个其他对象。这回答你的第二个问题。

我不知道HashSet's确切的实施,但与第一个问题解决这不会是一个问题。

+0

我已经改变了代码使用等于它仍然打印三次佛瑞德 – coder25 2012-03-08 15:13:15

+0

你didn'取消注释'HashCode'。 'HashCode'方法确定'HashSet'是否可以正常工作。看看Gilbert Le Blanc的回答。此外,如果你做'人p =新人(“弗雷德”);人p1 =新人(“弗雷德”); System.out.println(p.equals(p1));''你会得到'true'打印。 – twain249 2012-03-08 15:22:26