HashMap vs ArrayList性能我是正确的

时间:2009-10-05 03:02:57

标签: java performance arraylist hashmap

我目前相信:

  • 如果您需要一个随机检索项目的结构,请使用HashMap
  • 当您按顺序检索项目时(例如使用for循环) - 使用ArrayList

我一般是否正确?是否存在不正确的情况?

6 个答案:

答案 0 :(得分:46)

地图是map, or "associative array"。它具有键 - >值布局。另一方面,列表是list,它是元素的有序集合。

更直接的比较可能是在 Set 和List之间:这两个都保持值,列表是显式排序的(你可以得到元素#x),而这个集合(通常)不是有序的(除非它是SortedSet,在这种情况下,迭代顺序将由比较器排序。)

Set和List的两个最常见的实现是HashSet和ArrayList 。要检查元素是否属于arraylist(contains(element)),实现将迭代它的所有元素,检查是否使用equals()方法找到了元素。要检查元素是否属于散列集,首先计算元素的hashCode(),然后“直接”到 所在的位置,并检查它是否存在。

因此, ArrayList和HashSet之间的显着差异是contains()的速度。

在列表中,您可以询问元素#x,以及您可以对集合执行的操作,即添加,删除,询问是否存在(包含)以及迭代所有元素。

在地图上,您可以通过其键来索取元素,而不是像使用列表那样索引索引。

HashSet目前仅由HashMap实现,其中未使用key->值关系的值部分。这完全是荒谬的,除了浪费至少4个字节之外没有任何用处,可以争论12,插入HashSet中的每个和所有元素。

答案 1 :(得分:31)

一般来说,是的,你是对的。还有一个组合数据结构LinkedHashMap,可以快速访问任意元素以及可预测的排序。

但是,值得注意的是ArrayList和HashMap分别只是List和Map接口的两个实现。每种方法的其他实现可能更适合更具体的要求。例如,对于某些排队/出队要求,LinkedList可能会提供比ArrayList更高的性能。

答案 2 :(得分:9)

我会说你一般都是正确的,但并不完全准确。您使用HashMap进行数据检索,但并非总是随机的。您使用ArrayList进行迭代,但您也可以通过索引将其用于查找。

更一般地说,当您需要通过查找有效地检索项目时,使用Map实现,即基于密钥检索某些内容 - 例如字典,缓存,存储库等。

当您只想要一个可以迭代数据的数据结构时,通常在需要预定和/或可预测的顺序时使用List实现。

换句话说,您使用Map作为索引数据结构,并且使用List s,就像通常使用数组一样。

答案 3 :(得分:4)

对我来说,更重要的是我是否关心集合中物品的排序。如果您关心订单,请使用ArrayList。如果您不关心订单(您只想存储一堆商品),那么您可以使用HashMap。

答案 4 :(得分:4)

不要忘记,使用地图(如果有钥匙)来获取某个特定项目要比使用数据更快(除非你有一个索引,但是一把钥匙总能让你获得正确的价值)如果插入新元素或删除旧元素,则索引可能无效。

答案 5 :(得分:2)

我不同意。对我来说,这更多地取决于我想要检索项目的方式。如果我想基于它们的顺序(通过索引,确切地说)这样做,我倾向于使用像ArrayList(甚至是数组)这样的线性结构。如果我需要查找项目,我会使用像HashMap这样的地图结构。

另一个复杂因素与插入和命令有关,正如丹所指出的那样。