为什么我的 HashSet 中有重复数据?

Why i have duplicates data in my HashSet?

我正在尝试操作 Java 中的 HashSet。我看到,通常情况下, HashSet 中不可能有重复项?

这是我的代码

 public class A{
    private int elem;

    public A(int elem) {
        this.elem = elem;
    }   
}

在另一个 class

import java.util.HashSet;
import java.util.Iterator;

public class B{

    private String name;
    private HashSet<A> listeA;


    public static void main(String[] args){
        HashSet<A> a = new HashSet<A>();

        B s = new B("B",a);
        A l1 = new A(15);
        A l2 = new A(14);
        A l3 = new A(15);

        a.add(l1);
        a.add(l2);
        a.add(l3);

        s.displayHashset();

    }

所以如果 HashSet 不允许重复,为什么我在执行代码后有这个:

15 
15 
14

我不明白我的 HashSet 中如何接受第二个“15”。

感谢您的回复。

您没有覆盖 equals()hashcode()。 HashSet 根据 equals 方法检查一个对象是否与另一个对象相等。此外,为了不进行多次比较,它将具有相同哈希码的对象组合在一起。

请注意,每当重写此方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

equals 和 hashcode 的生成版本:

public class A{
    private int elem;

    public A(int elem) {
        this.elem = elem;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        A a = (A) o;
        return elem == a.elem;
    }

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

HashSet 使用 hashCode()equals() 方法来定义重复项。当您实现这些方法时,您通过 class 的重复实例告诉 HashSet 您的意思。 hashCode()equals() 的默认实现继承自 Object class 将 class 的每个实例视为一个唯一对象,因此 HashSet 允许多个实例其属性的相同值