【问题标题】:Difference between capacity growth of ArrayList and HashMapArrayList和HashMap容量增长的区别
【发布时间】:2013-11-05 13:10:50
【问题描述】:

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

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

在 HashMap 中,它表示它将内容重新散列到一个新数组中:

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

在数组列表中,Arrays.copyOf 调用 System.arraycopy。在 HashMap 中,它使用 while 循环将所有元素传输到新数组中。这两个集合之间有什么特别的区别,因为它们最终都会创建一个新数组吗?

【问题讨论】:

  • 数组支持的列表和哈希表支持的映射之间有什么区别吗?是的,有很多,所以计算相似之处比计算差异更容易。

标签: java arraylist hashmap


【解决方案1】:

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

请注意,HashMap 中的每个 Entry 都会缓存其哈希值以用于此操作。

【讨论】:

    【解决方案2】:

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

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

    为了更好的解释,请查看例如Wikipedia article

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 2011-01-24
      • 2012-02-04
      • 2011-02-15
      • 2020-10-11
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多