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です。

値型のジェネリック配列の場合、実際の値は配列に格納され、要素のサイズが説明どおりに使用されます。に値型を入れると、その値ArrayListはオブジェクトにボックス化され、そのオブジェクトへの参照がに格納されますArrayList

于 2013-01-09T10:22:36.203 に答える
2

の配列のstruct場合、各要素のサイズは既知です。

参照型の配列の場合、配列はヒープ内に存在する実際のオブジェクトへの参照(ポインター)を格納します。

ポインタのサイズも既知です。x86では4バイト、x64では8バイトです。

したがって、ポインタ演算は常に簡単で高速です。

の場合ArrayList、内部ストレージはであるobject[]ため、値型はボックス化されてヒープに格納されるため、実装は値型の格納には最適ではありません。

于 2013-01-09T10:22:17.320 に答える
1

さて、あなたはarrayListの実装が何であるかを尋ねました、ここにそれはあります: arraylist.cs

マイクロソフトから直接。これはRoslynの実装です。

于 2015-02-07T04:29:34.887 に答える