0

在 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 循环将所有元素传输到新数组中。这两个集合之间是否有任何特别的区别,因为它们最终都会创建一个新数组?

4

2 回答 2

6

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

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

于 2013-11-05T13:12:54.383 回答
1

hashmap 的工作方式与普通数组完全不同。主要目的是您可以直接访问 hashmap 中的任何对象,而无需遍历所有元素。这是通过计算一个“哈希值”来完成的,该哈希值有点像地图的直接索引(以地图的大小为模)。只有当那个槽已经被占用时,才会采取其他措施,

如果增加哈希图的大小,则必须在哈希图中重新排列元素。

如需更好的解释,请查看例如Wikipedia 文章

于 2013-11-05T13:15:43.417 回答