2013-01-09 48 views
2

希望這不是重複的。ArrayList內部實現

在此之前,我知道ArrayList並不是最好的選擇,但這只是好奇心。

簡單地說,我想知道ArrayList的實現。我看了看,發現它使用數組進行存儲。

對於數組,當你有:

int [] arr; 

ARR指向數組的第一個元素,因爲它的類型是整數,編譯器知道在哪裏跳:

arr[2] => arr value + 2 * typeof(int) = address of arr[2] 

現在,因爲ArrayList是無類型的,所以我想知道編譯器如何確定下一個項目在哪裏。我猜想有一個開銷,告訴數據是什麼,以便編譯器可以執行指針算術。

因此,ArrayList應該比任何其他類型的集合要慢,因爲它不能跳轉到數據,因爲它需要知道以前是什麼。這與LinkedList非常相似。

+3

爲什麼不找你自己。有很多反編譯器會反編譯爲C#。反射器是一個。 – Oded

+1

'typeof'與'sizeof'不一樣# – leppie

+0

沒有得到你在說什麼跳躍? ArrayList使用對象數組。獲得第二項是'_items [1]' –

回答

6

一個ArrayList只包含引用的對象,而不是對象本身。所有引用都是相同的大小,所以問題不存在。

參考的內部類型肯定是object

對於值類型的通用數組,實際值存儲在數組中,並按照您的描述使用元素的大小。如果將值類型放入ArrayList中,它將被裝入對象中,並且對該對象的引用將存儲在ArrayList中。

+0

Et瞧。 ArrayList是一個引用列表。那是我需要的。謝謝 – Everts

2

對於struct的數組,每個元素的大小是已知的。

對於引用類型的數組,該數組將存儲引用(指針)的實際對象,它們居住在堆中。

指針的大小也是已知的:x86上4個字節,x64上8個字節。

因此,指針算術總是簡單而快速。

ArrayList的情況下,內部存儲是object[],所以實現對於存儲值類型並不是最優的,因爲它們將被裝箱並存儲在堆中。

0

好吧,你問了一個ArrayList中的實現是什麼,那就是: arraylist.cs

直接從微軟不會少。