1. どのようにArrayList
構成されているか
ArrayList
要素を格納するために最も一般的に使用される Java クラスです。では、どのようにArrayList
機能するのでしょうか?また、なぜ誰もがそれをそれほど好むのでしょうか?
構造はArrayList
シンプルかつ独創的です。各ArrayList
オブジェクトには次の 2 つのフィールドが含まれます。
- 要素の配列
size
リスト内の要素の数を格納する変数
内部的には、ArrayList
オブジェクトには最も一般的な配列が含まれています。しかし、それだけではありません。リストの長さを格納するサイズ変数もあります。仕組みは次のとおりです。
初期状態では、リスト内の配列の長さは 10 です。また、size
変数は 0 です。
リストに要素を追加すると、その要素は配列の 0 番目のセルに格納され、size
1 に増加します。
さらに要素を 1 つ追加すると、その要素は 1 番目のセルに格納され、size
再び 1 増加して 2 になります。
配列内にスペースがなくなったときに別の要素を追加すると、メソッド内で次のことが起こりますadd()
。
- 前の配列の 1.5 倍の長さの新しい配列が作成されます
- 古い配列のすべての要素が新しい配列にコピーされます。
- オブジェクト内では
ArrayList
、新しい配列への参照が古い配列への参照を置き換えます。 - 渡された要素は、新しい配列の 10 番目のセルに保存されます。
- サイズ変数は 1 増加して11 になります。
リストの途中に要素を追加 (挿入) するときにも、同様のことが起こります。既存の要素は右に 1 シフトされ、渡された要素は配列の新しく解放されたセルに書き込まれます。
次に、リストに関する最も基本的なシナリオを検討します。
2. 要素をArrayList
要素がリストに追加されたときにリスト内で何が起こるかを見てみましょう。ArrayList オブジェクトが作成された直後、メモリには次のような内容が保存されます。
ArrayList
コンテナー (配列data
) と格納された要素の数 ( ) という 2 つのフィールド (2 つの変数) を含むオブジェクトがありますsize
。変数data
には、10 個の要素を格納できるコンテナ (配列) への参照が格納されます。
数値 5 を配列に追加すると、次の図が得られます。
配列には要素 5 と が格納されますsize == 1
。
size()
ここで誰かがオブジェクトのメソッドを呼び出すとArrayList
、戻り値はリストに格納されている要素の数になります。 1. リストの要素の数は、配列の格納容量と同じではありません。
現在のストレージ容量も配列自体も、ArrayList
オブジェクトの外部からアクセス (可視) することはできません。ArrayList
これは、現在も今後も の内部データです。
リストにさらに 7 つの数字を追加してみましょう: 10、20、30、40、50、60、70。
これでメモリは次のようになります。
ここでメソッドを呼び出すとsize()
、リスト内の新しい要素数である数値 8 が返されます。この値は内部配列のサイズとは関係ありません。
この図には過度に単純化されている部分が 1 つあります。
このArrayList
クラスはプリミティブ型を格納できないため、Integer
ではなく型を使用しますint
。コンテナーは値 {5, 10, 20, 30, 40, 50, 60, 70} を直接保存するのではなく、Integer
オブジェクトへの参照を保存します。コンテナ内のすべての空のセルが格納されますnull
。
3. リストの長さを増やす
内部配列に空のセルがなくなったときにリスト内で何が起こるかを見てみましょう。
10 個の要素のリストがあるとします。
それに100 という数字を追加することにします。このadd()
メソッドでは次のことが起こります。
ステップ 1 — 新しい配列を作成します。
ステップ 2 — 古い配列から新しい配列にすべての要素をコピーします。
ステップ 3 — 古い配列を置き換えます (ArrayList
オブジェクトの内部配列への参照を変更します)。
ステップ 4 — 新しい番号を追加します。これは、私たちが苦労して達成したものです。
GO TO FULL VERSION