发出「;包括「;哈希集方法(Java)

发出「;包括「;哈希集方法(Java),java,set,contains,hashset,Java,Set,Contains,Hashset,以下代码没有给出我期望的结果: public static void main (String[] args) { Set<Pair> objPair = new LinkedHashSet<Pair>(); objPair.add(new Pair(1, 0)); System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0)

以下代码没有给出我期望的结果:

public static void main (String[] args) {

    Set<Pair> objPair = new LinkedHashSet<Pair>();
    objPair.add(new Pair(1, 0));

    System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0)));

}

private static class Pair {

    private int source;
    private int target;

    public Pair(int source, int target) {
      this.source = source;
      this.target = target;
    }        
}
我不明白为什么它不起作用。 或者我使用“contains”方法是错误的(或者是因为错误的原因)

还有一个问题,, 如果我添加两次相同的值,它将被接受,即使是一个集合

objPair.add(new Pair(1, 0));
objPair.add(new Pair(1, 0));
它不会接受/识别我创建的类对吗


提前感谢。

您需要重写
对中的
hashCode
equals
方法
LinkedHashSet
(以及其他使用哈希代码的Java对象)将使用它们来定位和查找您的
Pair
对象。

没有您自己的hashCode()实现,Java认为两个
Pair
对象只有在定义上完全相同时才是相等的,始终创建“新”对象。在你的情况下,你想<代码>配对> /Cord>对象,如果它们对于“代码>源代码和<代码>目标< /代码>的值相同,则要考虑相等。要做到这一点,你需要告诉Java它应该如何测试<代码>配对< /Cord>对象以达到相等。(为了使散列映射按您期望的方式工作,您还需要生成与equals一致的散列码——松散地说,这意味着相等的对象必须生成相同的散列码,而不相等的对象应该生成不同的散列码

大多数IDE都会为您生成合适的hashcode()和equals()方法。我的IDE生成了以下方法:

  @Override
   public int hashCode() {
      int hash = 3;
      hash = 47 * hash + this.source;
      hash = 47 * hash + this.target;
      return hash;
   }

   @Override
   public boolean equals(Object obj) {
      if (obj == null) {
         return false;
      }
      if (getClass() != obj.getClass()) {
         return false;
      }
      final Pair other = (Pair) obj;
      if (this.source != other.source) {
         return false;
      }
      if (this.target != other.target) {
         return false;
      }
      return true;
   }

HashSet
使用哈希代码。您的
hashCode()
实现在哪里?哦,是的,我在这方面是新手,我可能需要进一步研究:)非常感谢!真不敢相信这是“唯一”的:)我想我忘了提到我是Java新手(不过你们注意到了…)非常感谢!我们曾经都是新人……)@NyanMaru建议如果你想大量学习Java,就阅读本书:——本书第9项包括
hashCode
equals
——我每隔几年就重读一次这本书,每次都学到一些新东西,第二版出版时就买了。
  @Override
   public int hashCode() {
      int hash = 3;
      hash = 47 * hash + this.source;
      hash = 47 * hash + this.target;
      return hash;
   }

   @Override
   public boolean equals(Object obj) {
      if (obj == null) {
         return false;
      }
      if (getClass() != obj.getClass()) {
         return false;
      }
      final Pair other = (Pair) obj;
      if (this.source != other.source) {
         return false;
      }
      if (this.target != other.target) {
         return false;
      }
      return true;
   }