为什么hashmap没有像ArrayList那样的ensureCapacity()方法?

时间:2017-02-02 06:37:21

标签: java arraylist hash hashmap

ArrayListHashMap都有构造函数来设置初始容量,ArrayList提供ensureCapacity()以确保内部数组已经增加,如果预计会有一些大量的元素插入。在某些情况下,HashMap也会发生同样的情况。那么为什么HashMap没有一个确保容量方法可以保持桶的准备好呢?

2 个答案:

答案 0 :(得分:1)

HashMapArrayList根本不同。

'桶的数量' ArrayList中的HashMap只是支持数组的大小,当它已满时,它已经满了。

'桶的数量'考虑到多个对象可以散列到同一个存储桶,并且Java采用的冲突解决策略是链接(即创建链接列表,或者HashMapProcessBuilder pb = new ProcessBuilder("java", "-jar", jarFileLocation, fileEntry.getAbsolutePath(), commonFileLocation).redirectError(new File("C:/Users/Desktop/log.txt"));; pb.start(); 并不能很好地指示它可以存储多少个对象。类似的,对于桶,如果多个对象哈希那里)。 (需要引证!)

确保public void capturePhoto() throws Exception { mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); Thread.sleep(WAIT_GENERIC); mCamera.stopPreview(); mCamera.release(); } 中的存储桶数量并不能确保在您已达到负载因素之前将其填满,从而无法忍受性能降低。因此,负载因子是确保您获得所需性能的更好方法。

答案 1 :(得分:1)

简短的回答是,它不是很有用。

ArrayListHashMap等结构具有 capacity 的概念,这是用户无法直接看到的某个内部数组的长度。容量不同于 size ,它是逻辑上包含在结构中的元素或条目的数量。

“容量”这个词实际上是用词不当,因为它实际上并不代表对用户有重要意义的任何限制。这是一个实现细节。随着元素或条目的添加,内部数组将自动且透明地调整大小。改变容量没有语义。您无法判断对ensureCapacity()的呼叫是否确实改变了容量,如果确实改变了容量,则列表或地图仍然等于之前的等值。

在API中具有容量概念的原因是为了在用户知道将要添加许多元素的情况下提高性能。在用户知道将要添加许多元素的情况下,这有助于避免重复调整大小的开销。最常见的情况是在施工时,您最有可能知道要添加多少元素。

请注意,批量添加方法(addAllputAll)将查看即将添加的内容的大小,并执行一次所需的目标大小调整。

如果你有一个想要添加大量元素的现有列表,你可以调用Arraylist.ensureCapacity();你很清楚要添加多少;你必须一次添加一个,而不是批量添加;并且您的应用程序对性能非常敏感,因此您必须避免多次调整大小。这似乎非常罕见。

可以想象一个API HashMap.ensureCapacity()。如有必要,它会调整内部表的大小,然后将所有元素重新分配到此表的存储区中。如果将来添加了大量条目,这将有助于避免重复调整大小/重新调整大小。这在语义上是一个合理的事情,但它真正有用的案例数量似乎很小。

最重要的是可以添加HashMap.ensureCapacity(),但是它没有足够的用途,因此从来没有优先添加它。