在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循环将所有元素传输到新数组。这两个集合之间是否存在任何特殊差异,因为它们最终都会创建一个新数组?
答案 0 :(得分:6)
HashMap
需要通过首先重新计算所有哈希值来传输实体,以决定将它们放入哪些桶中。这是必要的,因为索引取决于底层数组的大小。这就是为什么你不能简单地将Arrays.copyOf
或System.arraycopy
与HashMap
一起使用。
请注意,Entry
中的每个HashMap
都会缓存其哈希值,以便精确地执行此操作。
答案 1 :(得分:1)
hashmap的工作方式与普通数组完全不同。主要目的是您可以直接访问hashmap中的任何对象,而无需迭代所有元素。 这是通过计算“哈希值”来完成的,该哈希值的行为类似于地图的直接索引(以模型的大小为模)。只有在已经采用该槽位时,才采取其他措施,
如果增加散列映射的大小,则必须在散列映射中重新排列元素。
如需更好的解释,请查看例如: Wikipedia article。