如何使Java中的Set认为两个Object相同?

时间:2019-06-19 10:54:20

标签: java collections containers

有两个对象:

    private class Monkey{
        String name;

        public Monkey(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            return name.equals(((Monkey) obj).name);
        }
    }
    @Test
    public void contain(){
       Monkey monkey1 = new Monkey("Jon");
       Monkey monkey2 = new Monkey("Jon");

        java.util.Set<Monkey> monkeySet = new HashSet<>();
       monkeySet.add(monkey1);

       System.out.println(monkeySet.contains(monkey2));
       // false

       monkeySet.add(monkey2);
       System.out.println(monkeySet.size());
       // 2
    }

使用HashSet,它认为Monkey1和Monkey2不是同一对象。但是在我的项目中,如果monkey1.name == monkey2.name,则它们应该相同。

如何使HashSet认为Monkey1和Monkey2相同?

2 个答案:

答案 0 :(得分:2)

您还需要沿hashCode覆盖equals,以使这些内容相同。 这是一个示例如何做:

@Override
public int hashCode() {
    return Objects.hash(name);
}

请阅读以下优秀读物,以了解为什么需要这样做:why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java

答案 1 :(得分:0)

Hashset在equals方法中使用类的哈希码。当前,您正在使用默认的哈希码,并且equals方法返回false。在Monkey类中使用以下代码,您将获得所需的结果。

private class Monkey{
    String name;

    public Monkey(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
       if (this == o)
          return true;
       if (!(o instanceof Monkey))
          return false;

       Monkey monkey = (Monkey) o;

      return name.equals(monkey.name);
   }

   @Override
   public int hashCode() {
     return name.hashCode();
   }
}