2

希望这不是重复的。

在任何事情之前,我知道 ArrayList 不是最好的选择,但这只是好奇。

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

对于数组,当你有:

int [] arr;

arr 指向数组的第一个元素,因为它是整数类型,编译器知道跳转到哪里:

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

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

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

4

3 回答 3

6

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

引用的内部类型肯定是object.

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

于 2013-01-09T10:22:36.203 回答
2

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

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

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

因此,指针运算总是简单快捷。

在 的情况下ArrayList,内部存储是 a object[],因此该实现对于存储值类型并不是最佳的,因为它们也将被装箱并存储在堆中。

于 2013-01-09T10:22:17.320 回答
1

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

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

于 2015-02-07T04:29:34.887 回答