我开发了一个可以使用hashset概念的应用程序。我必须覆盖hashset中的equals(),hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请有人告诉我发生了什么而没有超越上述方法。
答案 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;
}
}
我创建了两个在所有方面都相同的Foo1
和Foo2
对象,但我没有覆盖equals()
或hashCode()
。
Foo foo1 = new Foo(10);
Foo foo2 = new Foo(10);
Java不会认为这些是平等的,即使我可以看到它们是相同的,因为我没有解释如何通过覆盖equals()
来比较它们。如果我打印出hashCode()的值,我将看到已分配给不同对象的不同整数值,如下所示:
foo1 = 1671711
foo2 = 11394033
因此,如果我将它们添加到HashSet
,当我真的只想要将其中一个放入时,它会很乐意将两个对象放在那里。
Here是一个类似的问题,用关于使用这些方法的面试问题。