方法覆盖hashset

时间:2011-10-17 16:51:50

标签: java

我开发了一个可以使用hashset概念的应用程序。我必须覆盖hashset中的equals(),hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请有人告诉我发生了什么而没有超越上述方法。

3 个答案:

答案 0 :(得分:1)

例如读这个: http://www.javamex.com/tutorials/collections/hash_code_equals.shtml

在其他地方有很多关于这个主题的讨论(我推荐Effective Java书籍)。

你不需要覆盖toString(),这是一个奖励。

基本上,如果你不重写equals,你将无法以预期的方式从集合中获取东西。例如。如果你的String类没有以有意义的方式实现equals,则collection.get(“abc”)和collection.get(new String(“abc”))会给你不同的结果。

答案 1 :(得分:0)

怎么样

public class MyHashSet<E> extends HashSet<E> {
    @Override public int hashCode() { ... }
    @Override public String toString() { ... }
    @Override public boolean equals(Object o) { ... }
}

同样的方法适用于您想要存储在HashSet中的对象

public class MyObject {
    @Override public int hashCode() { ... }
    @Override public String toString() { return "MyObject"; }
    @Override public boolean equals(Object o) { return this.equals(o); }
}

// Sample usage
HashSet<MyObject> set = ...
set.add(new MyObject());

答案 2 :(得分:0)

假设您要覆盖将要使用的对象,而不是HashSet中的方法,而不是HashSet本身中的方法,这样做的原因是您将获得预期的结果将对象放在HashSet中。 hashCode()HashSet的正常运作至关重要,equals()也是如此。覆盖toString()的主要原因是,您将获得一些对该对象有意义的表示,而不是该方法的默认Object版本。

基本上,如果您不覆盖这些方法,HashSet将无法达到预期效果。例如,假设我有一个类Foo,我没有覆盖这些方法。

public class Foo {
    private int number;

    public Foo(int newNumber) {
       number = newNumber;
    }

    public int getNumber() {
        return number;
    }
}

我创建了两个在所有方面都相同的Foo1Foo2对象,但我没有覆盖equals()hashCode()

Foo foo1 = new Foo(10);
Foo foo2 = new Foo(10);

Java不会认为这些是平等的,即使我可以看到它们是相同的,因为我没有解释如何通过覆盖equals()来比较它们。如果我打印出hashCode()的值,我将看到已分配给不同对象的不同整数值,如下所示:

foo1 = 1671711
foo2 = 11394033

因此,如果我将它们添加到HashSet,当我真的只想要将其中一个放入时,它会很乐意将两个对象放在那里。

Here是一个类似的问题,用关于使用这些方法的面试问题。