我目前相信:
HashMap
ArrayList
我一般是否正确?是否存在不正确的情况?
答案 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这样的地图结构。
另一个复杂因素与插入和命令有关,正如丹所指出的那样。