Java hashset中的方法重写
我开发了一个可以使用hashset概念的应用程序。我必须重写hashset中的equals()、hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请告诉我在不覆盖上述方法的情况下会发生什么。怎么样Java hashset中的方法重写,java,Java,我开发了一个可以使用hashset概念的应用程序。我必须重写hashset中的equals()、hashCode()和toString()方法。我不知道为什么要覆盖给定的方法。请告诉我在不覆盖上述方法的情况下会发生什么。怎么样 public class MyHashSet<E> extends HashSet<E> { @Override public int hashCode() { ... } @Override public String toStr
public class MyHashSet<E> extends HashSet<E> {
@Override public int hashCode() { ... }
@Override public String toString() { ... }
@Override public boolean equals(Object o) { ... }
}
公共类MyHashSet扩展了HashSet{
@重写公共int hashCode(){…}
@重写公共字符串toString(){…}
@重写公共布尔等于(对象o){…}
}
同样的方法也适用于要存储在哈希集中的对象
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());
公共类MyObject{
@重写公共int hashCode(){…}
@重写公共字符串toString(){返回“MyObject”;}
@重写公共布尔等于(对象o){返回this.equals(o);}
}
//样本使用
HashSet=。。。
set.add(新的MyObject());
例如,请阅读以下内容:
其他地方对这个主题有很多讨论(我推荐有效的Java书籍)
您不需要重写toString(),这是一个额外的功能
基本上,如果不重写equals,就无法按预期的方式从集合中获取内容。例如,如果您的字符串类没有以有意义的方式实现equals,则collection.get(“abc”)和collection.get(new String(“abc”))将给出不同的结果。假设您希望覆盖将在
哈希集
中使用的对象,而不是哈希集
本身中的方法,这样做的原因是,将对象放入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()
java不会认为这些是相等的,即使我可以看到它们是相等的,因为我没有解释如何通过重写<代码>等式>()/>代码来比较它们。如果打印hashCode()的值,我将看到分配给不同对象的不同整数值,如下所示:
foo1 = 1671711
foo2 = 11394033
因此,如果我将它们添加到HashSet
,它会很高兴地将两个对象都放在那里,而我实际上只希望其中一个放在那里
就使用这些方法的面试问题而言,是否也有类似的问题。您确定您所说的不是覆盖hashCode和equals,不管您在集合中放入何种类型的元素?老实说,你的问题目前太模糊,无法回答。你在问我们,如果你不重写某些方法,会有什么不同——但没有说你的重写行为是什么!请阅读我认为乔恩是对的,你在这个阶段很困惑,没有真正提出一个明确的问题。关于这方面的一个很好的资源是Josh Bloch的高效Java。第3章在这里是相关的,实际上可以在网上找到@马克·彼得斯·乔恩是对的?真正地我对此表示怀疑!
foo1 = 1671711
foo2 = 11394033