Java Set 获取重复条目

标签 java collections set unique hashset

JavaDoc 将设置定义为:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2)

为了验证这一点,我创建了一个非常简单的程序:

import java.util.HashSet;

public class CheckHashSet {
    public static void main(String[] args) {
        HashSet<Employee> set = new HashSet<Employee>();
        set.add(new Employee(10));
        set.add(new Employee(10));
        System.out.println(set.size());
        System.out.println(new Employee(10).equals(new Employee(10)));
    }

    private static class Employee implements Comparable<Employee> {
        private final int id;
        public Employee(int id) {
            this.id = id;
        }
        @Override
        public int compareTo(Employee o) {
            return this.id - o.id; 
        }

        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Employee) {
                return compareTo((Employee)obj)==0;
            }
            return false;
        }
    }
}

程序的输出是

2
true

这意味着 new Employee(10).equals(new Employee(10)) 返回 true,而 set.add(new Employee(10)); set.add(new Employee(10)); 添加对象两次。

我的代码有什么问题吗?

最佳答案

您的 Employee 类不会覆盖 hashCode - 它需要这样做才能使任何基于哈希的集合正常工作。

例如:

@Override
public int hashCode() {
    return id;
}

关于Java Set 获取重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016529/

相关文章:

java - 如何获取 ConcurrentHashMap 的最新 View ?

search - 使用 Redis 从集合中反向搜索

count - 方案:为什么 'set!' 修改局部变量 'let' ?

python - 从 python 上的 dict 获取集合运算符

java - PDFBox 2 - 如何在展平之前删除表单字段的边框?

java - 使用 Comparable 接口(interface)的匿名内部类

java - 在 Java 中将不可变实例分配给 Collection 的最佳方法

Java Applet 游戏 2D 窗口滚动

java - 如何使用 eclipse 在 J2ME 中使用 bouncy caSTLe API?

java - 当公共(public)方法具有私有(private)方法依赖性时如何测试公共(public)方法