为什么我的 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
允许多个实例其属性的相同值
我正在尝试操作 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
允许多个实例其属性的相同值