设置hashcode和equals以创建具有唯一对象的集合

时间:2011-12-13 15:47:04

标签: java hash-code-uniqueness

我会创建Set完全HashSet,仅包含char。例如a,b,c,d,e,f,g... 但是这些char s不是由原始类型表示的,而是我有一个对象

public FirstChar{

  private char c;

  public FirstChar(char c){

    this.c = c;

  }
}

现在我想将对象FirstChar添加到集合中,但为了避免重复的元素,我必须实现HashCode()equals()

我知道如何实现equals但是如何以我在集合中只有一个元素的方式实现hashcode

NB。请不要说我使用Eclipse

2 个答案:

答案 0 :(得分:3)

编辑:我刚刚看到你的评论,你只需要整个集合中的一个字母 - 这听起来像非常奇怪的要求,但它基本上通过以下方式实现:

public final class FirstChar {

  private final char c;

  public FirstChar(char c) {
    this.c = c;
  }

  @Override public int hashCode() {
      return 0;
  }

  @Override public boolean equals(Object other) {
      return other instanceof FirstChar;
  }
}

换句话说,FirstChar的每个实例都被认为与每个其他实例相同,并且它们都具有相同的哈希码。正如我所说,这真的很奇怪...... 肯定你想要什么?


原始回答

为一个逻辑上只有一个字符的值实现hashCode()很容易:

@Override
public int hashCode() {
    return c; // Use implicit conversion to int
}

检查Object.hashCode的合同,您会发现这很正常 - 假设您的equals方法基本上只是比较c的值。 (当你写“以我在集合中只有一个元素的方式”时,你的意思并不清楚 - 我假设你的意思是每个不同的角色只有一个元素。)

但是,我对FirstChar课程仅使用java.lang.Character提供的价值感到困惑。你有什么理由不能使用Set<Character>吗?

答案 1 :(得分:1)

在任何情况下,据我所知,hashCode课程中的Character方法只会将char作为int返回。

在您的特定情况下,如果您希望该集只包含添加的第一个FirstChar,则可以使所有FirstChar彼此相等:

class FirstChar{
    private char c;
    public FirstChar(char c){
        this.c=c;
    }
    public String toString(){
        return String.valueOf(c);
    }
    public boolean equals(Object o){
        return o instanceof FirstChar;
    }
    public int hashCode(){        
        return 42;
    }
}

但除非你有充分的理由,否则听起来不是一个好主意。