【问题标题】:Arraylist uses Array?Arraylist 使用 Array?
【发布时间】:2010-04-24 21:58:29
【问题描述】:

ArrayList 内部是否使用数组?如果我们使用默认构造函数(new ArrayList()),这是一个空数组吗?谢谢。

【问题讨论】:

  • 你为什么想知道——OO编程的一个要点是封装,这样你就不需要知道一个类的内部结构,只使用它的接口? (像往常一样,没有什么是完美的,他们可能有理由拥有这些知识)
  • @Mark:封装的目的不是让你完全不知道里面发生了什么;那是你没有知道里面发生了什么。了解系统的内部结构总是很有用。按照你的逻辑,LinkedList<T>List<T> 应该都不需要,因为它们都做同样的事情,对吧?
  • @Mark - 很高兴知道这样您就可以了解聪明人是如何完成他们所做的事情的。 @rkrauter - 如果您真的想知道,我建议您查看 .NET Framework 库源代码(是的,它可用)。 weblogs.asp.net/scottgu/archive/2008/01/16/…
  • 并不是说这回答了你的问题,但如果你使用的是 .NET 2.0 或更高版本,那么没有理由再使用 ArrayList 了,因为我们有更好的(通用)等价物—— List 类...msdn.microsoft.com/en-us/library/6sh2ey19.aspx

标签: .net arrays arraylist


【解决方案1】:

是的。验证这一点的最简单方法之一是查看源代码。您可以使用reference source,也可以简单地使用.NET Reflector 来反编译.NET DLL。

这是 ArrayList 的相关部分,来自 Reflector:

public class ArrayList : IList, ICollection, IEnumerable, ICloneable
{
    static ArrayList()
    {
        emptyArray = new object[0];
    }

    public ArrayList()
    {
        this._items = emptyArray;
    }

    private object[] _items;

    private static readonly object[] emptyArray;

    // etc...
}

您不应该总是依赖这种情况。这是一个实现细节,可能会在 .NET 的未来版本中发生变化(尽管可能不会)。同样对于新代码,您应该考虑使用List<T> 而不是ArrayList

【讨论】:

  • +1 是的,绝对应该使用 List 来代替这个旧集合。
  • 所有列表在内部都使用某种固定数组。我注意到 stringbuilder 也使用了一个数组。那么有没有动态内存呢?您必须预先分配一些内存并用东西填充它,当您需要添加更多东西时,您会预先分配更大的内存区域并再次开始用东西填充?只是想学习内功。谢谢。
【解决方案2】:

是的,ArrayList 使用数组来存储项目。

如果创建 ArrayList 时未指定容量,则使用默认的起始容量。默认的起始容量可能取决于框架的版本。对于框架 2,它似乎为零。在框架 1 中,我认为它是 16。

【讨论】:

  • 看IL,ArrayList一开始使用的是一个空数组。添加一个值时,该数组将更改为一个包含 4 个项目的数组。之后,只要阵列已满,容量就会翻倍。
【解决方案3】:

是的.. ArrayList 本身使用一个数组。

它拥有一个 Object 数组(在 java.c# 中也应该是相同的),以便为您提供同质性。虽然arraylist看起来是一个非常动态的内存分配类,但它的内部操作都是数组。

当你通过调用构造函数创建一个对象时,它在内部调用一个大小有限的数组,可能是 10(实际上在 java 中正好是 10)。然后,当您将对象添加到 arraylist 时,它也必须增加内部数组。所以必须增加内部数组的大小。因此,创建了一个大小为两倍的新数组,并将旧值复制到这个新数组中。请注意,数组的容量增加了,因此可以添加更多对象。

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 2015-11-10
    • 2015-12-22
    • 1970-01-01
    • 2010-09-29
    • 2013-05-20
    • 1970-01-01
    • 2021-11-11
    • 2013-06-19
    相关资源
    最近更新 更多