【问题标题】:Is an ArrayList an Array or a List?ArrayList 是数组还是列表?
【发布时间】:2013-08-05 16:59:28
【问题描述】:

简单的老式 C# 问题:ArrayListArray 还是 List?两者之间的差异是巨大的,所以我很好奇是否有人知道ArrayLists 存储数据的方式?

【问题讨论】:

  • 这是否意味着它就像一个扩展数组或其他东西? (删除时听起来非常慢)
  • 您是在问ArrayList 是否在内部将其数据存储为linked list
  • IList 只是一个允许动态调整大小的接口,但不需要任何特定的实现。所以ArrayList 是由数组支持的IList 实现。如果您想使用链表,请参阅LinkedList<T>
  • 如果LinkedList是一个链表,那么List是什么?
  • @sircodesalot 两个完全不同的概念。 .NET 术语中的列表是满足IList/IList&lt;T&gt; 接口的任何类,用于动态添加/删除项目并通过索引访问它们,而不管它是如何实现的。另一方面,链表是一种特定类型的数据结构,它(在我之前链接到的 Wikipedia 文章中进行了描述)。由于结构的设计方式,它不支持基于索引的访问,所以从技术上讲,LinkedList&lt;T&gt; 不是IList&lt;T&gt;

标签: c# data-structures


【解决方案1】:

ArrayList 的行为类似于一个列表(特别是,它的元素数量可以增加,不像一个数组),但它由一个数组支持,该数组将根据需要动态调整大小。因此名称为ArrayList

类似于列表的事物不必由数组支持(例如,它们可以是链表),但ArrayList 是。

【讨论】:

  • 完美。这就是我一直在寻找的。​​span>
  • 我很确定 List&lt;T&gt; 也有一个数组支持。
  • @Dimitar Dimitrov:是的。 ArrayList 虽然是预泛型。
  • 当您说动态调整大小时,是否需要将现有项目的完整副本复制到新数组中? (或者有一些我不知道的更快的方法)。似乎扩展和删除会相当慢。
  • @sircodesalot:完整副本。我认为它在重新增长时会加倍(这种几何增长是标准的,Java 使用 3/2 作为其ArrayList,而 Python 使用 9/8 作为其列表)。通过这样做,我们得到摊销 O(1) 插入,并且最多浪费O(n) 空间。要插入n 元素,我们只需要log n regrowths。
【解决方案2】:

.NET Framework 包含一个提供此功能的数据结构 - System.Collections.ArrayList 类ArrayList 维护一个内部对象数组,并随着添加到 ArrayList 的元素数量的增加自动调整数组的大小。由于 ArrayList 使用对象数组,因此开发人员可以添加任何类型 — 字符串、整数、FileInfo 对象、Form 实例等等。

虽然ArrayList 提供了比标准阵列更高的灵活性,但这种灵活性是以性能为代价的。因为ArrayList 存储了一个对象数组,所以在从ArrayList 读取值时,您需要将其显式转换为存储在指定位置的数据类型。回想一下,值类型的数组(例如 System.Int32System.DoubleSystem.Boolean 等)是以 unboxed 形式连续存储在托管堆中。然而,ArrayList's 内部数组是一个对象引用数组。因此,即使您有一个只存储值类型的 ArrayList,每个 ArrayList 元素都是对 boxed 值类型的引用。

除了从 List 继承的成员之外,您还可以调用 ArrayList 特定方法并使用 ArrayList 特定成员。

【讨论】:

    【解决方案3】:

    除了其他区别之外,还有一个区别是 ArrayList 不是强类型的,即数组列表可以添加任何类型的从 object 派生的元素,如下面的代码所示

    ArrayList myArrayList = new ArrayList();
    myArrayList.Add(1);
    myArrayList.Add("test");
    

    但数组和 IList 是强类型的,即我们可以利用它们的编译类型检查,例如

    int[] myarray = new int[5];
    myarray[0] = 1; // This is correct
    myarray[1] = "test"; // compile time error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-23
      • 2011-02-15
      • 2021-11-28
      • 2014-09-27
      • 2019-07-26
      • 2023-03-28
      • 2013-03-11
      • 1970-01-01
      相关资源
      最近更新 更多