【发布时间】:2012-03-10 23:03:44
【问题描述】:
这个QAHow does Java implement hash tables?描述了Hashtable是通过Java中的静态数组实现的(底层静态数组会根据项目总数细化)。
为什么Java不通过动态数组实现Hashtable,比如ArrayList?
什么是权衡?
【问题讨论】:
标签: java algorithm arraylist hashtable
这个QAHow does Java implement hash tables?描述了Hashtable是通过Java中的静态数组实现的(底层静态数组会根据项目总数细化)。
为什么Java不通过动态数组实现Hashtable,比如ArrayList?
什么是权衡?
【问题讨论】:
标签: java algorithm arraylist hashtable
调整底层数组的大小需要重新散列哈希表中的所有项目,这是一项非常昂贵的操作,并且会使当前在数组中的任何项目的位置无效 - 这就是为什么每次项目数量超过某个阈值时通常将数组大小加倍的原因(负载系数)。由于调整大小是在内部管理的,并且现有的项目必须移动到一个新位置,所以像 ArrayList 这样的“可调整大小的数组”是没有意义的。
【讨论】:
调整哈希表的大小时,需要重新定位所有条目。
因此,使用 ArrayList 会更慢,因为 ArrayList 会在 HashTable 重新计算所有旧值之前复制现在无用的旧值。
【讨论】:
实现类非常不透明。由于ArrayList 与真正的静态数组相比效率相当低,因此无需使用它。
您不会有任何好处,至少通过这种方式您可以节省包含哈希映射的静态数组的包装器。
调整ArrayList 的大小就像调整HashMap 的大小一样,因为它们都使用静态底层数组,但无论如何您都需要重新散列地图的所有元素,因此实际上没有必要使用它.
【讨论】: