ArrayList和HashMap的容量增长之间的差异

时间:2013-11-05 13:10:51

标签: java arraylist hashmap

在ArrayList中,它基本上使用grow方法增长到一个新的大小:

private void grow(int minCapacity) {
...
...
elementData = Arrays.copyOf(elementData, newCapacity);
}

在HashMap中,它说它将内容重新组合到一个新数组:

Entry[] newTable = new Entry[newCapacity];
...
transfer(...)

在arraylist中,Arrays.copyOf调用System.arraycopy。在HashMap中,它使用while循环将所有元素传输到新数组。这两个集合之间是否存在任何特殊差异,因为它们最终都会创建一个新数组?

2 个答案:

答案 0 :(得分:6)

HashMap需要通过首先重新计算所有哈希值来传输实体,以决定将它们放入哪些桶中。这是必要的,因为索引取决于底层数组的大小。这就是为什么你不能简单地将Arrays.copyOfSystem.arraycopyHashMap一起使用。

请注意,Entry中的每个HashMap都会缓存其哈希值,以便精确地执行此操作。

答案 1 :(得分:1)

hashmap的工作方式与普通数组完全不同。主要目的是您可以直接访问hashmap中的任何对象,而无需迭代所有元素。 这是通过计算“哈希值”来完成的,该哈希值的行为类似于地图的直接索引(以模型的大小为模)。只有在已经采用该槽位时,才采取其他措施,

如果增加散列映射的大小,则必须在散列映射中重新排列元素。

如需更好的解释,请查看例如: Wikipedia article