何时应该使用List而不是LinkedList?

14 浏览
0 Comments

何时应该使用List而不是LinkedList?

在什么情况下使用List比使用LinkedList更好?

admin 更改状态以发布 2023年5月24日
0
0 Comments

将链式列表视为列表可能会有些误导。它更像是一个链条。事实上,在 .NET 中,LinkedList 甚至没有实现 IList 接口。链表中没有真正的索引概念,尽管可能看起来有。该类提供的所有方法都不接受索引。

链表可以是单向的,也可以是双向的。这指的是链中每个元素仅具有到下一个元素的链接(单向链接),还是同时具有到前/后元素的链接(双向链接)。LinkedList 是双向链接的。

在内部,List 是由一个数组支持的。这提供了一个在内存中非常紧凑的表示。相反,LinkedList 需要额外的内存来存储相邻元素之间的双向链接。因此,LinkedList 的内存占用将普遍比 List 大(但有一个警告:为了在追加操作期间提高性能,List 可能具有未使用的内部数组元素。)

它们也具有不同的性能特征:

追加

  • LinkedList.AddLast(item) 常数时间
  • List.Add(item) 平摊常数时间,线性最坏情况

前置

  • LinkedList.AddFirst(item) 常数时间
  • List.Insert(0, item) 线性时间

插入

  • LinkedList.AddBefore(node, item) 常数时间
  • LinkedList.AddAfter(node, item) 常数时间
  • List.Insert(index, item) 线性时间

删除

  • LinkedList.Remove(item) 线性时间
  • LinkedList.Remove(node) 常数时间
  • List.Remove(item) 线性时间
  • List.RemoveAt(index) 线性时间

数量

  • LinkedList.Count 常数时间
  • List.Count 常数时间

包含

  • LinkedList.Contains(item) 线性时间
  • List.Contains(item) 线性时间

清除

  • LinkedList.Clear() 线性时间
  • List.Clear() 线性时间

从以上内容可以看出,它们基本上是等效的。在实践中,LinkedList 的 API 使用起来更为麻烦,并且其内部需要的细节会泄漏到您的代码中。

然而,如果你需要频繁地在列表内进行插入或删除,它可以提供恒定的时间。而List则需要线性时间,因为在插入或删除后必须对列表中多余的项目进行调整。

0
0 Comments

在大多数情况下,List更有用。 LinkedList在列表中间添加/删除项目的成本较低,而List只能在列表末尾便宜添加/删除。

LinkedList只有在访问顺序数据(向前或向后)时才最有效-随机访问相对昂贵,因为每次都必须遍历链表(因此它没有索引器)。但是,由于List基本上只是一个数组(带封装器),随机访问没问题。

List还提供了许多支持方法-FindToArray等;但是,通过.NET 3.5 / C#3.0的扩展方法,这些也可以用于LinkedList,因此这少了一个因素。

0