有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

新HashMap(int)和guava映射之间的java差异。newHashMapWithExpectedSize(int)

在Java中,您可以创建一个新的HashMap来保存特定数量的项,如下所示:

Map m = new HashMap(100);

Guava提供了一个Maps.newHashMapWithExpectedSize(int)方法,我希望它可以简单地调用HashMap(int)。但它不这样做,而是计算自己的容量并使用它

为什么newHashMapWithExpectedSize做它自己的事情,为什么我想直接调用new HashMap(int)来使用它


共 (3) 个答案

  1. # 1 楼答案

    HashMap构造函数参数是映射的容量,即存储桶的数量

    因此,如果将10作为参数传递,并在映射中存储8个键,将达到重新刷新阈值(默认为75%),映射将重新刷新

    另一方面,传递给newHashMapWithExpectedSize()的参数是映射的预期大小。因此,如果你通过10个,番石榴将创建一个有足够多桶的地图,以确保地图在插入10个元素时不会重新刷新:至少14个桶

  2. # 2 楼答案

    你读过这个方法的Javadoc

    Creates a HashMap instance, with a high enough "initial capacity" that it should hold expectedSize elements without growth.

    请注意new HashMap(int)构造函数的“initial size”参数指定了存储条目的哈希表的初始大小,这基本上是一个实现细节,您不必关心。当哈希表超过映射的加载因子(默认值为0.75)时,它将调整大小,这意味着如果您指定初始容量为16,然后向映射添加16个条目,哈希表几乎肯定会调整大小

    使用Guava的方法,如果指定预期大小为16,然后添加16个条目,则哈希表应该而不是调整大小

  3. # 3 楼答案

    Guava只需将传递的大小乘以2(以安全的方式),然后调用常规hashmap构造函数。这使得它更稀疏,因此在散列时冲突更少

    容量计算中的javadoc提到,它会计算容量的一个值,以便hashmap在25%到50%之间满,这与触发调整大小的阈值相去甚远

    标准库将预期大小四舍五入到最接近的2次方,并将其分配为大小,然后将调整大小的阈值设置为75%。如果我们随机询问大小,标准库将在50%的情况下调整大小

    如果避免阈值是唯一的考虑因素,那么乘以1.34就足够有足够的空间来避免在填充预期大小的元素时调整大小

    它看起来像是典型的速度与空间的较量,谷歌工程师更像是速度狂人,而太阳/甲骨文工程师则更像是空间狂人