2013-01-09 49 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

直接从微软不会少。