【问题标题】:Is having hashtable efficient when there are large number of keys?当有大量键时,哈希表是否有效?
【发布时间】:2018-09-09 11:47:19
【问题描述】:

我是 HashMaps 的新手。谁能告诉我当有大量键时,哈希表是否有效?

【问题讨论】:

  • 你说的有多大?
  • 您在考虑什么替代方案?比较高效?
  • 对什么有效?迭代?查找键?
  • 哈希表是线程安全的,即同步,也就是性能开销。如果您不需要它是线程安全的,请使用哈希映射。
  • 请正确澄清您的问题

标签: java hash


【解决方案1】:

对于 HashMap,为了“高效”,映射容量应该大于它所拥有的键数。但更重要的是,密钥必须具有具有良好哈希分布的hashCode 方法。

默认情况下,java HashMap 的负载因子为 0.75,这意味着当你填充 75% 时,它的容量会增加:

来自:https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

此实现为基本的 操作(get 和 put),假设散列函数分散 桶中的元素。对集合视图的迭代 所需时间与 HashMap 实例的“容量”成正比 (桶的数量)加上它的大小(键值的数量 映射)。因此,不要设置初始容量非常重要 如果迭代性能太高(或负载因子太低) 很重要。

HashMap 的实例有两个影响其性能的参数: 初始容量和负载系数。容量是个数 哈希表中的桶,初始容量就是 创建哈希表时的容量。负载系数是 衡量哈希表在其之前允许获得的完整程度 容量自动增加。当条目数在 哈希表超过负载因子和当前的乘积 容量,哈希表被重新哈希(即内部数据 结构被重建),因此哈希表大约有两倍 桶的数量。

但更重要的是与密钥对象一起使用的hashCode。 它应该具有良好的(随机)分布,平等地击中所有内部索引(存储桶),否则如果 hashCode 很差,您的 HashMap 可能会在最坏的情况下表现得像线性搜索列表一样。

利用这些信息,您可以估计您的性能(基于可用内存和哈希键分布)

也请查看这篇文章: https://www.linkedin.com/pulse/10-things-java-developer-should-know-hashmap-chinmay-parekh

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 2015-11-27
    • 2015-09-18
    • 1970-01-01
    • 2013-06-07
    • 2016-02-28
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多