Java 为什么我的哈希集中有重复的数据?

Java 为什么我的哈希集中有重复的数据?,java,hashmap,set,hashset,Java,Hashmap,Set,Hashset,我试图用Java操作HashSet。我看到,通常情况下,HashSet中不可能存在重复项 这是我的密码 public class A{ private int elem; public A(int elem) { this.elem = elem; } } 在另一节课上 import java.util.HashSet; import java.util.Iterator; public class B{ private Strin

我试图用Java操作HashSet。我看到,通常情况下,HashSet中不可能存在重复项

这是我的密码

 public class A{
    private int elem;

    public A(int elem) {
        this.elem = elem;
    }   
}
在另一节课上

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();

    }
我不明白我的哈希集中怎么能接受第二个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);
    }
}
您没有重写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方法定义重复项。当您实现这些方法时,您会告诉HashSet类的重复实例是什么意思。从Object类继承的hashCode和equals的默认实现将类的每个实例视为唯一的对象,因此HashSet允许多个实例的属性值相同

HashSet使用hashCode和equals方法定义重复项。当您实现这些方法时,您会告诉HashSet类的重复实例是什么意思。从Object类继承的hashCode和equals的默认实现将类的每个实例视为唯一的对象,因此HashSet允许多个实例的属性值相同

它们是不同的对象,只是具有相同的属性它们是不同的对象,只是回复时具有相同的属性,我看了这个但不明白,现在对我来说很清楚。谢谢你的回复,我看了这个但不明白,现在对我来说很清楚。谢谢你的回复,我看了这个但不明白,现在对我来说很清楚。谢谢你的回复,我看了这个但不明白,现在对我来说很清楚。