hashmap中holder类的用途是什么?

lzfw57am  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(447)

我在这件事上发现了 HashMap 我们有一个内部类 Holder 描述如下:

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

我们该怎么用,什么时候用?它的效用是什么。请解释一下。

inn6fuwd

inn6fuwd1#

这与Java7U6的改进有关,在Java8中已被删除。
相关文件:
JavaSE7中的集合框架增强
当遇到大量密钥哈希冲突时,替代哈希函数可以提高这些Map实现的性能。
对于java se 7u6,此可选哈希函数的实现方式如下:
替代哈希函数仅应用于容量大于指定阈值大小的Map。默认情况下,阈值为 -1 . 此值禁用备用哈希函数。要启用备用哈希函数,请设置 jdk.map.althashing.threshold 将系统属性设置为其他值。建议值为 512 . 将此系统属性设置为 512 使容量大于512个条目的所有Map使用可选哈希函数。可以将此系统属性设置为 0 ,这将导致所有Map都使用备用哈希函数。
...

JavaSE8中的集合框架增强
另一种选择 String 在7u6中添加的哈希函数已经从jdk8中删除,同时 jdk.map.althashing.threshold 系统属性。相反,包含大量冲突密钥的散列箱通过将它们的条目存储在平衡树中而不是链表中来提高性能。
现在,回答你的问题:
我们该怎么用,什么时候用?
你凭什么认为你应该用它?它是一个没有任何公共文档的私有类,所以你不必关心它。这是oracle的 HashMap 你不能直接使用它。你能间接使用它的唯一方法就是通过 jdk.map.althashing.threshold 系统属性。
为什么甲骨文的工程师会使用这样的支架?因为装载顺序。虚拟机很难加载所有类,因为它们之间有很多依赖关系,所以可能会卡住。因此,所有内部类的开发人员都要确保他们没有使用可能尚未加载/可能导致加载顺序问题的类的方法/属性。
这就是一个这样的帮助程序,它仅在加载所有其他类并完全引导vm之后初始化一个值。只有在类第一次被访问时,holder中的值才会被初始化,并且这个访问被一个 sun.misc.VM.isBooted() 打电话。

相关问题