C#深入研究ArrayList動態陣列自動擴容原理
阿新 • • 發佈:2018-12-22
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,否則翻倍。(6到13行是防止溢位處理)
以上就是動態陣列ArrayList自動擴容原理。