2010-04-24 41 views
4

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

+3

为什么你想知道 - OO编程的一点是封装,所以你不需要知道一个类的内部使用它的接口? (像往常一样,没有什么是完美的,他们可能有理由有知识) – Mark 2010-04-24 22:01:28

+3

@Mark:封装的目的不是你完全不知道里面发生了什么;这是你没有*知道里面发生了什么。它总是有助于理解系统的内部。根据你的逻辑,'LinkedList '和'List '应该不需要,因为它们都做同样的事情,对吧? – 2010-04-24 22:08:04

+2

@Mark - 很高兴知道,让你了解聪明人如何做他们做的事。 @rkrauter - 如果你真的想知道,我建议你去看看.NET框架库源代码(是的,它是可用的)。 http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx – AboutDev 2010-04-24 22:08:48

回答

7

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

这里的ArrayList中的相关部分,从反射器:

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

+1是的,列表绝对应该用来代替这个较旧的集合。 – Pat 2010-04-24 22:39:29

+0

所以所有的列表都在内部使用某种固定数组。我注意到stringbuilder也使用了一个数组。所以没有动态记忆?你必须预先分配一些内存并填充内容,当你需要添加更多的内容时,你预先分配一个更大的内存区域并开始填充内容?只试图学习内部。谢谢。 – rkrauter 2010-04-24 23:45:36

2

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

它拥有一个Object数组(在java中,c#应该也是一样的)来给你一个均匀性。虽然arraylist似乎是一个非常动态的内存分配类,但它的内部操作充满了数组。

通过调用构造函数创建一个对象的时候,它在内部调用一个有限大小的数组,可能是10(java中实际上只有10个)。然后,当你添加对象到数组列表时,它也必须增加内部数组。所以内部阵列的大小必须增加。所以,创建一个新数组的大小是原来的两倍,并且旧值被复制到这个新数组中。注意数组的容量增加了,所以可以添加更多的对象。

3

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

如果在未指定容量的情况下创建ArrayList,将使用默认启动容量。默认的启动容量可能取决于框架的版本。对于框架2,它似乎是零。在框架1中,我认为它是16.

+1

首先看一下IL,ArrayList使用一个空数组。当添加一个值时,该数组被更改为4个项目。之后,只要阵列已满,容量就会加倍。 – Joren 2010-04-24 22:14:24