hashset 如何检查重复元素?
How hashset checks for duplicate elements?
请查看我的代码:
HashSet<A> set = new HashSet<A>();
for (int i = 0; i < 10; i++)
set.add(new A());
System.out.println(set.contains(new A()));
Class A 定义为:
class A {
public boolean equals(Object o) {
return true;
}
public int hashCode() {
return (int) (Math.random()%100);
}
}
如果hashset内部使用了hashmap……为什么输出是true?
因为不同的哈希码意味着它们的桶位置不同。
那么如何检查 new A() returns true .
此外,如果我 return 1 始终来自哈希码输出为真,这似乎没问题。
原因是你的哈希码函数:
(int) (Math.random()%100);
总是returns 0
。所以所有 A
元素总是有相同的哈希码。因此,所有 A 元素都将位于 HashSet 中的同一个桶中,因为您的 equals 将始终 return 为真。一旦它在同一个桶中找到一个 A(在这种情况下总是如此),它就会 return 真的那个 A 已经被包含了。
Math.random()
return 是一个介于 0 和 1 之间的数字,因此对任何事物取模将始终是 0
。
你可能想用 *
而不是 %
来获得 0 到 100 之间的随机数
(int) (Math.random() * 100);
随心所欲
HashSet
对具有相同哈希桶的所有对象使用 equals()
来确定 contains()
。因为 equals()
总是 true
,新的 A
匹配哪个桶并不重要,但是所有对象都在同一个桶中,因为 (int)(Math.random() % 100)
总是 0
.
尝试将哈希更改为:
(int)(Math.random() * 100)
请查看我的代码:
HashSet<A> set = new HashSet<A>();
for (int i = 0; i < 10; i++)
set.add(new A());
System.out.println(set.contains(new A()));
Class A 定义为:
class A {
public boolean equals(Object o) {
return true;
}
public int hashCode() {
return (int) (Math.random()%100);
}
}
如果hashset内部使用了hashmap……为什么输出是true? 因为不同的哈希码意味着它们的桶位置不同。 那么如何检查 new A() returns true .
此外,如果我 return 1 始终来自哈希码输出为真,这似乎没问题。
原因是你的哈希码函数:
(int) (Math.random()%100);
总是returns 0
。所以所有 A
元素总是有相同的哈希码。因此,所有 A 元素都将位于 HashSet 中的同一个桶中,因为您的 equals 将始终 return 为真。一旦它在同一个桶中找到一个 A(在这种情况下总是如此),它就会 return 真的那个 A 已经被包含了。
Math.random()
return 是一个介于 0 和 1 之间的数字,因此对任何事物取模将始终是 0
。
你可能想用 *
而不是 %
来获得 0 到 100 之间的随机数
(int) (Math.random() * 100);
随心所欲
HashSet
对具有相同哈希桶的所有对象使用 equals()
来确定 contains()
。因为 equals()
总是 true
,新的 A
匹配哪个桶并不重要,但是所有对象都在同一个桶中,因为 (int)(Math.random() % 100)
总是 0
.
尝试将哈希更改为:
(int)(Math.random() * 100)