1. どのようにArrayList構成されているか

ArrayList要素を格納するために最も一般的に使用される Java クラスです。では、どのようにArrayList機能するのでしょうか?また、なぜ誰もがそれをそれほど好むのでしょうか?

構造はArrayListシンプルかつ独創的です。各ArrayListオブジェクトには次の 2 つのフィールドが含まれます。

  • 要素の配列
  • sizeリスト内の要素の数を格納する変数

内部的には、ArrayListオブジェクトには最も一般的な配列が含まれています。しかし、それだけではありません。リストの長さを格納するサイズ変数もあります。仕組みは次のとおりです。

初期状態では、リスト内の配列の長さは 10 です。また、size変数は 0 です。

リストに要素を追加すると、その要素は配列の 0 番目のセルに格納され、size1 に増加します。

さらに要素を 1 つ追加すると、その要素は 1 番目のセルに格納され、size再び 1 増加して 2 になります。

配列内にスペースがなくなったときに別の要素を追加すると、メソッド内で次のことが起こりますadd()

  1. 前の配列の 1.5 倍の長さの新しい配列が作成されます
  2. 古い配列のすべての要素が新しい配列にコピーされます。
  3. オブジェクト内ではArrayList新しい配列への参照が古い配列への参照を置き換えます
  4. 渡された要素は、新しい配列の 10 番目のセルに保存されます。
  5. サイズ変数は 1 増加して11 になります

リストの途中に要素を追加 (挿入) するときにも、同様のことが起こります。既存の要素は右に 1 シフトされ、渡された要素は配列の新しく解放されたセルに書き込まれます。

次に、リストに関する最も基本的なシナリオを検討します。


2. 要素をArrayList

要素がリストに追加されたときにリスト内で何が起こるかを見てみましょう。ArrayList オブジェクトが作成された直後、メモリには次のような内容が保存されます。

ArrayList への要素の追加

ArrayListコンテナー (配列data) と格納された要素の数 ( ) という 2 つのフィールド (2 つの変数) を含むオブジェクトがありますsize。変数dataには、10 個の要素を格納できるコンテナ (配列) への参照が格納されます。

数値 5 を配列に追加すると、次の図が得られます。

ArrayList への要素の追加 2

配列には要素 5 と が格納されますsize == 1

size()ここで誰かがオブジェクトのメソッドを呼び出すとArrayList、戻り値はリストに格納されている要素の数になります。 1. リストの要素の数は、配列の格納容量と同じではありません。

現在のストレージ容量も配列自体も、ArrayListオブジェクトの外部からアクセス (可視) することはできません。ArrayListこれは、現在も今後も の内部データです。

リストにさらに 7 つの数字を追加してみましょう: 10、20、30、40、50、60、70。

これでメモリは次のようになります。

ArrayList への要素の追加

ここでメソッドを呼び出すとsize()、リスト内の新しい要素数である数値 8 が返されます。この値は内部配列のサイズとは関係ありません。

重要:

この図には過度に単純化されている部分が 1 つあります。

このArrayListクラスはプリミティブ型を格納できないため、Integerではなく型を使用しますint。コンテナーは値 {5, 10, 20, 30, 40, 50, 60, 70} を直接保存するのではなく、Integerオブジェクトへの参照を保存します。コンテナ内のすべての空のセルが格納されますnull



3. リストの長さを増やす

内部配列に空のセルがなくなったときにリスト内で何が起こるかを見てみましょう。

10 個の要素のリストがあるとします。

リストの長さを増やす

それに100 という数字を追加することにします。このadd()メソッドでは次のことが起こります。

ステップ 1 — 新しい配列を作成します。

リストの長さを増やす 2

ステップ 2 — 古い配列から新しい配列にすべての要素をコピーします。

リストの長さを増やす 2

ステップ 3 — 古い配列を置き換えます (ArrayListオブジェクトの内部配列への参照を変更します)。

リストの長さを増やす 3

ステップ 4 — 新しい番号を追加します。これは、私たちが苦労して達成したものです。

リストの長さを増やす 4