【问题标题】:How to make Set in Java think two Object is same? [duplicate]如何让 Java 中的 Set 认为两个 Object 是相同的? [复制]
【发布时间】:2019-11-02 02:17:54
【问题描述】:

有两个对象:

    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 相同?

【问题讨论】:

  • 还需要覆盖Monkey中的hashCode()方法。

标签: java collections containers


【解决方案1】:

您还需要沿 equals 覆盖 hashCode 以使这些内容相同。 下面是一个例子:

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

请阅读这篇好文章以了解您为什么需要这样做:why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java

【讨论】:

    【解决方案2】:

    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();
       }
    }
    

    【讨论】:

    • 如果名称为空怎么办?
    • 会有NullPointerException。我们需要处理这种情况。在这种情况下,您可以使用 "".hashCode();空字符串的平均哈希值。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2017-05-22
    • 2019-04-27
    • 2015-04-20
    相关资源
    最近更新 更多