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

标签 java hashmap set 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);
    }
}

关于java - 为什么我的 HashSet 中有重复数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58123436/

相关文章:

list - 使用 JSTL 迭代 List 和 Map 的元素 <c :forEach> tag

java - HashMap put方法

Python:如何存储可变变量(例如集合)?

java - 归并排序列表实现TopDown + BottomUp + Abstract MergeSort

java - Mac 是否支持零复制原理

Eclipse 上不同项目中相同包中的 Java 相同类

java - 寻求一种有效的方法来生成我的 HashMap 实例

java - 如何将对象数组转为自定义类型数组(涉及ArrayList)

Ruby 在哈希中插入键值元素

Java Jar -java.lang.NoClassDefFoundError : com. google.api.client.http.HttpTransport 来自