【问题标题】:Does Java HashTable abide by the load factor (we specify) when we use a custom hash function?当我们使用自定义哈希函数时,Java HashTable 是否遵守负载因子(我们指定)?
【发布时间】:2019-11-27 18:24:19
【问题描述】:

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;}

那么即使我的hashcode函数很差,0.67的负载因子还会保留吗?

【问题讨论】:

标签: java hashtable hashcode load-factor


【解决方案1】:

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

其他专家可以对此提供更多信息并帮助我改进我的答案。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2022-11-14
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多