C#深入研究ArrayList動態數組自動擴容原理



1
void Test1() 2 { 3 ArrayList arrayList = new ArrayList(); 4 int length = 3; 5 for (int i = 0; i < length; i++) 6 { 7 arrayList.Add("TestData"); 8 } 9 Console.WriteLine("count = " + arrayList.Count); 10 Console.WriteLine("capacity = " + arrayList.Capacity); 11 }
1          static void Main(string[] args)
2         {
3             Test t = new Test();
4             t.Test1();
5             Console.ReadKey();
6         }        

新建一個Test 類,添加一個方法Test1(),添加如上代碼,在main方法中調用。

輸出結果為:count = 3

      capacity = 4

如果length = 0,輸出結果為

      count = 0

      capacity = 0

如果length = 1,輸出結果為

      count = 1

      capacity = 4

如果length = 4,輸出結果為

      count = 4

      capacity = 4

如果length = 5,輸出結果

      count = 5

      capacity = 8

先介紹下ArrayList的兩個字段就不難理解為什么會輸出這樣的結果。

Count字段含義為動態數組的實際長度,Capacity含義為動態數組的實際容量,這兩個字段的含義是不同的。我們借助反編譯工具來一探究竟。

public virtual int Add(object value)
{
    if (this._size == this._items.Length)   //如果長度和容量相等,則調用EnsureCapacity方法       
    {
        this.EnsureCapacity(this._size + 1);
    }
    this._items[this._size] = value;
    this._version++;
    int num = this._size;
    this._size = num + 1;            //否則長度+1,容量不變
    return num;
}

這是ArrayList源碼中的Add方法,_size相當於count,  _items.Length相當於Capacity.我們把注意力放在這一行代碼:

 this.EnsureCapacity(this._size + 1);
 1 private void EnsureCapacity(int min)
 2 {
 3     if (this._items.Length < min)
 4     {
 5         int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
 6         if (num > 0x7fefffff)
 7         {
 8             num = 0x7fefffff;
 9         }
10         if (num < min)
11         {
12             num = min;
13         }
14         this.Capacity = num;
15     }
16 }

把注意力放在第5行發現,如果容量為0,則設置為4,否則翻倍。

以上就是動態數組ArrayList自動擴容原理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM