java - 集合的唯一性

标签 java

如果我以 HashSet<E> 为例, 并向其添加对象,它如何检查对象是否已经存在?

我有以下简单设置:

private class MyObject {
    String text;

    public MyObject(String text) {
        this.text = text;
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof MyObject) {
            return ((MyObject) o).text.equals(text);
        }

        return false;
    }

}

在我的项目中,我有很多这样的对象,但都是单独初始化的。我想通过将所有内容添加到 Set 来过滤 double ,像这样:

MyObject m1 = new MyObject("1");
MyObject m2 = new MyObject("1");
MyObject m3 = new MyObject("2");

System.out.println(m1.equals(m2)); //expected: true, result: true
System.out.println(m1.equals(m3)); //expected: false, result: false

Set<MyObject> myObjects = new HashSet<MyObject>();
myObjects.add(m1);
myObjects.add(m2);
myObjects.add(m3);

System.out.println(myObjects.size()); //expected: 2, result: 3

Set<String> stringList = new HashSet<String>();
stringList.add("1");
stringList.add("1");
stringList.add("2");
System.out.println(stringList.size()); //expected: 2, result: 2

我怎样才能使我的 myObjects set 不包含这些 double ?所以m1m2是不同的实例,但具有相同的内容,所以我只需要 m1 .

编辑
根据 Mathias Schwarz 的回答,我实现了 hashCode()功能如下:

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

但是如果我有一个包含多个字段的更复杂的类,我该如何实现这个方法呢?

最佳答案

HashSet 根据对对象调用equalshashCode 的结果判断两个对象是否相同。如果您实现 equals,则必须实现 hashCode。如果它们不一致,HashSet 将无法正常运行... 所以重要的是这两个方法是如何在 MyObject 上实现的(顺便说一句,这实际上是一个类...)。

关于java - 集合的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857882/

相关文章:

java - AbstractTableModel setValueAt 方法未被调用

java - Apache Nutch - 修改要抓取的链接队列

java - 在Spring Boot中将soap响应转换回xml字符串

java - hadoop flume log4j 配置

java - 是否建议将Arraylist转换为Reactor的flux来处理数据?

java - JTable Unknown 错误,该怎么办?

java - 使用java代码更改浏览器的互联网设置

java - 使用 PMD 和 XPath 禁止所有 java.sql 包

java - 尝试最佳解决方案?

java - 我的程序中的无限 do-while 循环(java)