LinkedHashMap vs HashMap!= LinkedList vs ArrayList

时间:2010-03-08 21:14:45

标签: java list collections map

我已经读过LinkedHashMap的迭代速度比HashMap快,因为它的元素彼此双重链接。此外,因此,插入或删除元素时LinkedHashMap较慢。大概是因为这些链接也需要更新。

虽然我可以看到LinkedList与ArrayList的类比,因为LinkedList的元素也是双重链接的,我读到它比ArrayList迭代,并且具有更快的插入和删除时间。

这是为什么?也许我在某个地方犯了错误?

干杯!

4 个答案:

答案 0 :(得分:27)

这个比喻不起作用。 LinkedList和ArrayList是List的两个不相关的实现。但是,LinkedHashMap与HashMap的数据结构相同,但是将LinkedList编织到其中以使迭代更快更一致。

LinkedHashMap迭代比HashMap迭代更快的原因是HashMap迭代必须迭代所有桶,甚至是空桶。 LinkedHashMap有一个指向数据的列表这一事实意味着它可以跳过空桶。 LinkedHashMap中的列表是一个链表,因为删除时间保持不变(如果它是一些由arrray支持的列表,则为O(n))。

答案 1 :(得分:6)

链接列表迭代运行时(访问每个元素)在理论上与数组列表相同。两者都需要O(n)(Big-O Notation)运行时。但是,因为数组的内存分配是在连续的内存块上(链表元素是单独分配的,可能在内存中的任何位置),所以缓存生效。

答案 2 :(得分:4)

一些细节:

LinkedHashMap的迭代器顺序与插入地图的顺序相同。因此LinkedList部分只需要在末尾“插入”(对于跟踪尾部的链表是O(1)),而Map部分只进行O(1)的映射插入。一般的链表插入是O(N),并且ArrayList插入必须在插入发生之前对内容进行数组复制。

答案 3 :(得分:0)

要迭代链表,必须遵循每个元素中的每个引用(链接)。这些引用几乎可以指向任何地方,不能保证下一个元素在内存中跟随当前元素,这对于缓存是不利的。因为必须检索每个引用,所以它更慢。 数组在内存中是连续的,下一个元素只是当前元素的内存位置,随着元素的大小递增。

对于双向链表,在数组中的任何位置插入都非常快,因为只需要更改前后元素的引用。另一方面,数组较慢,因为在任何点插入都会导致整个数组被复制以为新元素腾出空间。当没有为阵列分配足够的连续内存加上新添加的元素时,即使附加元素也会导致整个数组被复制。

在处理大数据集时,您会特别注意插入差异。无论arraycopy()有多快,双重链表总是更快插入。因为HashMaps很少被迭代并依赖于插入和顺序,所以双链表可能会提升性能。