新HashMap(int)和guava映射之间的java差异。newHashMapWithExpectedSize(int)
在Java中,您可以创建一个新的HashMap
来保存特定数量的项,如下所示:
Map m = new HashMap(100);
Guava提供了一个Maps.newHashMapWithExpectedSize(int)
方法,我希望它可以简单地调用HashMap(int)
。但它不这样做,而是计算自己的容量并使用它
为什么newHashMapWithExpectedSize
做它自己的事情,为什么我想直接调用new HashMap(int)
来使用它
# 1 楼答案
HashMap构造函数参数是映射的容量,即存储桶的数量
因此,如果将10作为参数传递,并在映射中存储8个键,将达到重新刷新阈值(默认为75%),映射将重新刷新
另一方面,传递给newHashMapWithExpectedSize()的参数是映射的预期大小。因此,如果你通过10个,番石榴将创建一个有足够多桶的地图,以确保地图在插入10个元素时不会重新刷新:至少14个桶
# 2 楼答案
你读过这个方法的Javadoc吗
请注意
new HashMap(int)
构造函数的“initial size”参数指定了存储条目的哈希表的初始大小,这基本上是一个实现细节,您不必关心。当哈希表超过映射的加载因子(默认值为0.75)时,它将调整大小,这意味着如果您指定初始容量为16,然后向映射添加16个条目,哈希表几乎肯定会调整大小使用Guava的方法,如果指定预期大小为16,然后添加16个条目,则哈希表应该而不是调整大小
# 3 楼答案
Guava只需将传递的大小乘以2(以安全的方式),然后调用常规hashmap构造函数。这使得它更稀疏,因此在散列时冲突更少
容量计算中的javadoc提到,它会计算容量的一个值,以便hashmap在25%到50%之间满,这与触发调整大小的阈值相去甚远
标准库将预期大小四舍五入到最接近的2次方,并将其分配为大小,然后将调整大小的阈值设置为75%。如果我们随机询问大小,标准库将在50%的情况下调整大小
如果避免阈值是唯一的考虑因素,那么乘以1.34就足够有足够的空间来避免在填充预期大小的元素时调整大小
它看起来像是典型的速度与空间的较量,谷歌工程师更像是速度狂人,而太阳/甲骨文工程师则更像是空间狂人