2010-04-24 40 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