java - 如何让 Java 中的 Set 认为两个 Object 相同?

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

最佳答案

您还需要沿 equals 覆盖 hashCode 以使它们相同。 这是一个如何做到这一点的例子:

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

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

关于java - 如何让 Java 中的 Set 认为两个 Object 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56666013/

相关文章:

c# - 如何共享项目的代码文档?

Java:列表插入多个具有相同哈希值的对象

java - 如何在 JPA 中拥有 2 个相同类型的集合?

java - Collections.sort() 方法未正确选择重载方法

c++ - 简单高效的C++容器,具有map和list容器的特点

java - 如何在复合 Material (swt)中创建调色板

java - 使用 Gson 显示枚举及其属性的映射

mysql - 具有多个 Mysql 容器的 Docker 无法正常工作

java - JavaScript 和 Java 默认支持 REST 还是我需要安装新软件?

.net - Docker容器未运行Windows系统调用错误