c# - 为什么.NET中队列的底层实现要用数组?

标签 c# .net data-structures queue

<分区>

我目前正在阅读 C# In a Nutshell,书中提到队列数据结构的底层实现使用一个根据需要调整大小的数组。这种调整大小当然会产生成本,所以我想知道使用它而不是双链表的基本原理是什么?鉴于我们只关心第一个和最后一个元素,并且双链表比数组更有效地调整大小,为什么要使用数组?数组会占用更少的内存,但这是唯一的理由吗?

编辑: 抱歉,刚刚意识到这几乎是一个完全相同的副本: Why are Stack<T> and Queue<T> implemented with an array? (他们的问题甚至来自同一本书)。无论如何,感谢您的所有回答!

最佳答案

出于同样的原因,许多其他数据结构,如堆栈、哈希表、邻接表等,都是使用数组而不是链表来实现的:

  • 使用事实上的标准大小调整策略,即指数增长,即使您从一个空数组开始并插入几百万个项目,您也只需要两打调整大小操作。前几个调整大小操作只会复制几个字节。
  • 尤其是队列很少无限制地增长,因此您基本上可以避免调整大小。
  • 不只是更紧凑一点,普通值类型(int)的引用类型的双向链表整整比等价数组大三倍,甚至不用per-object考虑分配开销。如果我们诚实并考虑到这些因素,我们必须为每个节点添加一个或两个单词的 header ,因此它更像是大 4 倍或 5 倍。这使阵列可能存在的任何过度分配相形见绌。
  • 由于是连续的,数组几乎可以无限地更好地利用各种缓存。这几乎会影响您可以在队列上执行的任何操作,除了询问其大小,包括调整大小。
  • 必须分配所有这些列表节点并进行垃圾收集。虽然分代 GC 应该使分配相当便宜并且应该很容易地挑选只在队列中花费很少时间的节点,但它仍然有很多不必要的工作,如果队列很大或很少使用,许多节点在之前的次要 GC 中幸存下来被从队列的末尾弹出,就是这样。

关于c# - 为什么.NET中队列的底层实现要用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18366318/

相关文章:

c# - 使用 Microsoft.SqlServer.Management.Smo 更改 SQL SERVER EXPRESS 2008 TCP 端口

c# - 在 ASP.NET MVC 中设置包含连字符的 html 属性时出现问题

c# - BitArray 可以是动态的吗?还是 List<bool> 是唯一的方法?

c++ - C++中的动态数组VS链表

c - 区分文件C中的数据

c# - 使用参数运行 ASP.NET 页面?

c# - 为什么我的方法声明会产生不一致的可访问性错误?

c# - 如何一次性执行多个字符串替换?

java - 如何实现具有多个键的 Map?

c# - 是否可以在 Web 部件中使用多线程访问 SharePoint 2010 列表?