HashMap中Holder类的用途是什么?

Ank*_*oni 5 java collections hashmap

我发现在HashMap我们的内部类中Holder有以下描述:

/**
 * holds values which can't be initialized until after VM is booted.
 */
Run Code Online (Sandbox Code Playgroud)

我们如何以及何时使用该课程?它的用途是什么?请解释.

Pet*_*ček 7

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


相关文件:

Java SE 7中的集合框架增强功能

当遇到大量密钥哈希冲突时,备用哈希函数可提高这些映射实现的性能.

对于Java SE 7u6,此替代散列函数实现如下:

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

...

Java SE 8中的集合框架增强功能

String7u6中添加的备用哈希函数已从JDK 8中删除,并附带jdk.map.althashing.threshold系统属性.相反,包含大量冲突键的哈希箱通过将其条目存储在平衡树而不是链表中来提高性能.


现在,回答你的问题:

我们如何以及何时使用该课程?

是什么让你认为你应该使用它?这是一个没有任何公共文档的私人课程,所以你不必关心它.这是Oracle的实现细节,HashMap您无法直接使用它.您可以间接使用它的唯一方法是通过jdk.map.althashing.threshold系统属性.

为什么Oracle的工程师会使用这样的持有者?因为类加载顺序.VM很难加载所有类,因为它们彼此之间有很多依赖关系,它可能会被卡住.因此,所有内部类的开发人员都要确保他们没有使用可能尚未加载的类的方法/属性/可能导致加载顺序问题.

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