如何在Java中扩展HashSet?

时间:2012-03-26 11:55:47

标签: java hashset

假设我有一个CategoryKey课程:

public class CategoryKey {
    public int layer;
    public int parent;
    public int child;
}

我尝试将其中的许多实例放在Set中,但我们知道HashSet不适合存储自定义类的实例。那么如何扩展java类HashSet以满足我的要求呢?或者我如何创建一个实现接口Set的新类来解决同样的问题?

3 个答案:

答案 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