假设我有一个CategoryKey
课程:
public class CategoryKey {
public int layer;
public int parent;
public int child;
}
我尝试将其中的许多实例放在Set
中,但我们知道HashSet
不适合存储自定义类的实例。那么如何扩展java类HashSet
以满足我的要求呢?或者我如何创建一个实现接口Set
的新类来解决同样的问题?
答案 0 :(得分:10)
但是我们知道HashSet不适合自定义类的商店实例
是的,只要你认为你的课适当。特别是:
equals()
和hashCode()
例如:
public final class CategoryKey {
private final int layer;
private final int parent;
private final int child;
public CategoryKey(int layer, int parent, int child) {
this.layer = layer;
this.parent = parent;
this.child = child;
}
public int getLayer() {
return layer;
}
public int getParent() {
return parent;
}
public int getChild() {
return child;
}
@Override public boolean equals(Object other) {
if (!(other instanceof CategoryKey)) {
return false;
}
CategoryKey otherKey = (CategoryKey) other;
return layer == otherKey.layer
&& parent == otherKey.parent
&& child == otherKey.child;
}
@Override public int hashCode() {
int hash = 23;
hash = hash * 31 + layer;
hash = hash * 31 + parent;
hash = hash * 31 + child;
return hash;
}
}
答案 1 :(得分:2)
为什么HashSet不适合存储自定义类的实例?
只要您的班级有equals()
和hashCode()
的正确实施,它就可以正常使用。
答案 2 :(得分:1)
覆盖equals
的{{1}}和hashCode
方法以在CategoryKey
中提供唯一的实例
不包含重复元素的集合。更正式的,集合 不包含元素e1和e2对,使得e1.equals(e2)和at 大多数一个null元素。
参考here