【问题标题】:Why i have duplicates data in my HashSet?为什么我的 HashSet 中有重复数据?
【发布时间】:2020-01-27 02:58:51
【问题描述】:

我正在尝试在 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();

    }

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

15 
15 
14

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

感谢您的回复。

【问题讨论】:

  • 它们是不同的对象,只是具有相同的属性

标签: java hashmap set hashset


【解决方案1】:

您没有覆盖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);
    }
}

【讨论】:

  • 感谢您的回复,我看过这个但不明白,现在我清楚了。
【解决方案2】:

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

【讨论】:

  • 感谢您的回复,我看过这个但无法理解,现在我清楚了。
猜你喜欢
  • 1970-01-01
  • 2012-02-15
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多