0

Java 允许我们指定我们希望创建的哈希表的大小和所需的负载因子。如果我们使用自定义 HashCode 方法自己生成密钥,那么负载因子必须依赖于我们 HashCode 的效率/优点。我怎么知道我最初指定的负载系数要求仍然得到满足?

低于我想要的负载因子是 0.67。

Hashtable<Long, String[]> ht = new Hashtable<>(100, 0.67f);

但是,如果我说以下

public int hashCode(int n){
 int a = n%72;
 return a;}

那么即使我的哈希码功能很差,0.67的负载因子仍然会保留吗?

4

2 回答 2

2

根据您的问题,即使哈希码功能很差,仍会保留 0.67 的负载因子。负载因子用于决定何时增加内部结构的大小以适应新的数据集。如果哈希码功能不佳,您可能会遇到很多冲突。

其他专家可以对此进行更多说明,并帮助我改进答案。

于 2019-07-18T18:52:57.990 回答
1

这是 HashTable 的 Java8 实现的链接。
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/Hashtable.java。它是一个很好的资源,可以帮助您了解如果您过度使用默认方法会发生什么。

提出您的问题: hashCode 方法对负载因子没有影响。每次将条目放入表中时都会使用加载因子来检查集合是否需要重新散列。哈希表的容量默认为 11,阈值为容量 * loadFactor。如果表中的当前条目数超过此值,将使用两倍于原始表大小的集合执行 rehash。
hashCode 方法不会影响这个过程,但是正如前面的答案所指出的,它控制冲突并且直接负责 Hashtable 的性能。一个糟糕的哈希函数就像将所有数据存储在几个 LinkedList 中并在相应的列表中迭代搜索一样好。

于 2019-07-18T20:09:03.617 回答