新的HashMap(int)和番石榴Maps之间的区别.newHashMapWithExpectedSize(int)

2022-09-03 14:57:45

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

Map m = new HashMap(100);

番石榴提供了一种方法,我希望简单地称之为.但它不这样做,而是计算自己的容量并使用它。Maps.newHashMapWithExpectedSize(int)HashMap(int)

为什么做它自己的事情,为什么我要使用它而不是直接调用?newHashMapWithExpectedSizenew HashMap(int)


答案 1

你读过该方法的Javadoc吗

创建一个实例,该实例具有足够高的“初始容量”,它应该可以容纳元素而不会增长。HashMapexpectedSize

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

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


答案 2

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

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

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