我发现在HashMap
中我们有一个内部类Holder
,其中包含以下描述:
/**
* holds values which can't be initialized until after VM is booted.
*/
我们如何以及何时使用该课程?它的用途是什么?请解释一下。
答案 0 :(得分:7)
这与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()
调用屏蔽此访问权限。