【问题标题】:What is the use of Holder class in HashMap?HashMap中Holder类有什么用?
【发布时间】:2015-04-28 11:47:59
【问题描述】:

我发现在HashMap 中有一个内部类Holder,其描述如下:

/**
 * holds values which can't be initialized until after VM is booted.
 */

我们必须如何以及何时使用该类?它有什么用处。请解释一下。

【问题讨论】:

  • 你的虚拟机是什么意思?
  • 在内部,我也不知道
  • Vm 表示“Java 虚拟机”

标签: java collections hashmap


【解决方案1】:

这与 Java 7u6 的改进有关,已在 Java 8 中删除。


相关文档:

Collections Framework Enhancements in Java SE 7

替代散列函数提高了这些地图的性能 当大量密钥哈希冲突发生时的实现 遇到过。

对于 Java SE 7u6,此替代哈希函数实现为 如下:

替代散列函数仅适用于具有容量的地图 大于指定的阈值大小。默认情况下,阈值为 -1。此值禁用备用散列函数。要启用 替代哈希函数,设置jdk.map.althashing.threshold 系统属性设置为不同的值。推荐值为512。 将此系统属性设置为 512 会导致所有地图具有容量 大于 512 个条目以使用替代散列函数。你可以 将此系统属性设置为0,这会导致所有地图使用 替代哈希函数。

...

Collections Framework Enhancements in Java SE 8

7u6 中添加的替代 String 哈希函数已被移除 从 JDK 8 开始,以及 jdk.map.althashing.threshold 系统 财产。相反,包含大量碰撞的散列箱 键通过将它们的条目存储在平衡树中来提高性能 而不是链表。


现在,回答你的问题:

我们必须如何以及何时使用该类?

是什么让你认为你应该使用它?这是一个私人课程without any public docs,所以你不必关心它。这是Oracle的HashMap的实现细节,不能直接使用。您可以间接使用它的唯一方法是通过jdk.map.althashing.threshold 系统属性。

甲骨文的工程师为什么要使用这样的支架?因为类加载顺序。当它们之间存在大量依赖关系时,VM 很难加载所有类,它可能会卡住。因此,所有内部类的开发人员都要确保他们没有使用可能尚未加载/可能导致加载顺序问题的类的方法/属性。

这是一个这样的助手,它仅在加载所有其他类并且 VM 完全启动后才初始化一个值。只有在第一次访问该类时,才会初始化持有者中的值,并且此访问被 sun.misc.VM.isBooted() 调用屏蔽。

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2018-10-24
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多