Java Set获取重复条目

PC.*_*PC. 1 java collections unique set hashset

JavaDoc将set定义为:

不包含重复元素的集合.更正式地说,集合不包含元素e1和e2对,因此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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是

2
true
Run Code Online (Sandbox Code Playgroud)

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

我的代码出了什么问题?

Jon*_*eet 7

您的Employee类不会覆盖hashCode- 它需要这样做才能使任何基于散列的集合起作用.

例如:

@Override
public int hashCode() {
    return id;
}
Run Code Online (Sandbox Code Playgroud)