HashMap中Holder类的作用是什么?

5

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

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

这个类是用来干什么的?我们何时需要使用它?请解释一下。


你指的是哪个虚拟机? - Andrey Taptunov
它在内部,我也不知道。 - Leo
1
Vm 意味着“Java虚拟机”。 - Ankush soni
1个回答

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

相关文档:

Java SE 7中的集合框架增强

当遇到大量键散列冲突时,备用哈希函数可以提高这些映射实现的性能。

对于Java SE 7u6,备用哈希函数的实现如下:

备用哈希函数仅适用于容量大于指定阈值大小的映射。默认情况下,阈值为-1。此值禁用了备用哈希函数。要启用备用哈希函数,请将jdk.map.althashing.threshold系统属性设置为不同的值。建议值为512。将此系统属性设置为512会导致所有容量大于512个条目的映射使用备用哈希函数。您可以将此系统属性设置为0,这会导致所有映射都使用备用哈希函数。

...

Java SE 8 中的集合框架增强

7u6 中添加的替代 String 哈希函数已从 JDK 8 中删除,同时也删除了 jdk.map.althashing.threshold 系统属性。相反,包含大量冲突键的哈希桶通过将其条目存储在平衡树中而不是链接列表中来提高性能。


现在,回答你的问题:
如何以及何时使用这个类?你为什么认为你需要使用它?这是一个私有类没有任何公共文档,所以你不需要关心它。它是Oracle的HashMap的实现细节,你不能直接使用它。你唯一能间接使用它的方式是通过jdk.map.althashing.threshold系统属性。
那么为什么Oracle的工程师要使用这样的持有者?因为类加载顺序。当类之间有很多依赖关系时,VM加载所有类可能会陷入困境。因此,所有内部类的开发人员必须确保他们不使用可能尚未加载/可能导致加载顺序问题的类的方法/属性。
这是其中一个辅助程序,它仅在所有其他类都加载并且VM完全启动后才初始化值。只有在第一次访问类时,持有者中的值才会被初始化,并且此访问受到sun.misc.VM.isBooted()调用的保护。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接