ArrayList内部实现

时间:2013-01-09 10:16:52

标签: c# .net arraylist language-implementation principles

希望这不是重复。

在此之前,我知道ArrayList不是最好的选择,但这只是好奇心。

简单地说,我想知道ArrayList的实现。我查看并想通了它使用数组进行存储。

对于数组,当你有:

int [] arr;

arr指向数组的第一个元素,因为它被键入为整数,编译器知道跳转的位置:

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

现在,由于ArrayList是无类型的,我想知道编译器如何找出下一个项目的位置。我猜想有一个开销告诉数据是什么,以便编译器可以执行指针算术。

因此,ArrayList应该比任何其他类型的集合慢,因为它不能只是跳转到数据,因为它需要知道之前的内容。这与LinkedList非常相似。

3 个答案:

答案 0 :(得分:6)

ArrayList只包含对象的引用,而不包含对象本身。所有引用都是相同的大小,因此问题不存在。

引用的内部类型肯定是object

对于值类型的通用数组,实际值存储在数组中,并且在您描述时使用元素的大小。如果在ArrayList中放置一个值类型,它将被装入一个对象,并且该对象的引用存储在ArrayList中。

答案 1 :(得分:2)

对于struct的数组,每个元素的大小都是已知的。

对于引用类型数组,该数组存储引用(指针)到堆中的实际对象。

指针的大小也是已知的:x86上有4个字节,x64上有8个字节。

因此,指针算法总是简单快速。

对于ArrayList,内部存储是object[],因此实现不是存储值类型的最佳选择,因为它们也会被装箱并存储在堆中。

答案 2 :(得分:1)

好的,你问过arrayList的实现是什么,这里是: arraylist.cs

直接来自微软。这是Roslyn的实现。