希望这不是重复。
在此之前,我知道ArrayList不是最好的选择,但这只是好奇心。
简单地说,我想知道ArrayList的实现。我查看并想通了它使用数组进行存储。
对于数组,当你有:
int [] arr;
arr指向数组的第一个元素,因为它被键入为整数,编译器知道跳转的位置:
arr[2] => arr value + 2 * typeof(int) = address of arr[2]
现在,由于ArrayList是无类型的,我想知道编译器如何找出下一个项目的位置。我猜想有一个开销告诉数据是什么,以便编译器可以执行指针算术。
因此,ArrayList应该比任何其他类型的集合慢,因为它不能只是跳转到数据,因为它需要知道之前的内容。这与LinkedList非常相似。
答案 0 :(得分:6)
ArrayList
只包含对象的引用,而不包含对象本身。所有引用都是相同的大小,因此问题不存在。
引用的内部类型肯定是object
。
对于值类型的通用数组,实际值存储在数组中,并且在您描述时使用元素的大小。如果在ArrayList
中放置一个值类型,它将被装入一个对象,并且该对象的引用存储在ArrayList
中。
答案 1 :(得分:2)
对于struct
的数组,每个元素的大小都是已知的。
对于引用类型数组,该数组存储引用(指针)到堆中的实际对象。
指针的大小也是已知的:x86上有4个字节,x64上有8个字节。
因此,指针算法总是简单快速。
对于ArrayList
,内部存储是object[]
,因此实现不是存储值类型的最佳选择,因为它们也会被装箱并存储在堆中。
答案 2 :(得分:1)
好的,你问过arrayList的实现是什么,这里是: arraylist.cs
直接来自微软。这是Roslyn的实现。