ArrayListは内部的にどのデータ構造を使用しますか?
内部的にArrayList
はObject[]
を使用します。
ArrayList
にアイテムを追加すると、リストはバッキング配列に空きがあるかどうかを確認します。空きがある場合、新しいアイテムは次の空きスペースに追加されます。空きがない場合は、新しい大きなアレイが作成され、古いアレイが新しいアレイにコピーされます。
これで、さらにスペースが残り、新しい要素が次の空きスペースに追加されます。
人々はソースコードが本当に好きだから:
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData;
JDKから直接。
Object[]
を使用し、配列がいっぱいになると、より大きな配列を作成します。
ソースコードはこちら を読むことができます。
ArrayListはオブジェクトの配列を使用して、データを内部に保存します。
ArrayListを初期化すると、サイズ1(デフォルト容量)の配列が作成され、ArrayListに追加された要素が実際にこの配列に追加されます。 10がデフォルトのサイズであり、ArrayListの初期化中にパラメーターとして渡すことができます。
新しい要素を追加するときに、配列がいっぱいの場合、初期サイズの50%以上の新しい配列が作成され、最後の配列がこの新しい配列にコピーされるため、新しい要素を追加するための空のスペースができます。
使用される基本的なデータ構造は配列であるため、リストの最後に追加される新しい要素をArrayListに追加するのはかなり簡単です。要素を他の場所、たとえば先頭に追加する場合、すべての要素は、新しい要素を追加するために先頭に空のスペースを作成するために1つ右に移動する必要があります。このプロセスは時間のかかる(線形時間)です。しかし、ArrayListの利点は、要素の取得が任意の位置で非常に高速(定数時間)であるということです。
ArrayList
の基本的なデータ構造は次のとおりです。
_private transient Object[] elementData;
_
実際にArrayList
を作成すると、次のコードが実行されます。
_ this.elementData = new Object[initial capacity];
_
ArrayList
は、次の2つの方法で作成できます。
List list = new ArrayList();
デフォルトのコンストラクターが呼び出され、デフォルトサイズ10でObject
の配列を内部的に作成します。
List list = new ArrayList(5);
この方法でArrayList
を作成すると、整数引数を持つコンストラクターが呼び出され、デフォルトサイズ5のObject
の配列が作成されます。
add
メソッド内では、現在の要素のサイズがArrayList
の最大サイズ以上であるかどうかがチェックされ、サイズがnewの新しいArrayList
が作成されますarraylist = (current arraylist*3/2)+1
および古い配列リストからデータをコピーします。
ArrayListは、配列を使用してデータを保持します。要素の数が割り当てられた配列を超えると、データを別の配列にコピーします。おそらくサイズは2倍になります。
(マイナー)パフォーマンスヒットは、配列をコピーするときに取得されるため、配列リストのコンストラクターで内部配列のサイズを設定することが可能です。
さらに、Java.util.Collection
およびおよびJava.util.list
であり、したがって、指定されたインデックスで要素を取得することが可能であり、反復可能です(配列のように)。
Object []を使用します。配列がいっぱいになると、サイズが50%大きい新しい配列が作成され、現在の要素が新しい配列にコピーされます。自動的に発生します。
配列といくつかの整数を使用して、最初の値-最後の値のインデックスを示します
private transient int firstIndex;
private transient int lastIndex;
private transient E[] array;
こちら 実装例。
通常、ArrayLists
のような構造は、クラス内で定義された古き良き形式の配列によって実装され、クラスの外部から直接アクセスすることはできません。
一定量のスペースが最初にリストに割り当てられ、配列のサイズを超える要素を追加すると、配列は新しい容量で再初期化されます(通常は現在のサイズの倍数なので、フレームワークは新しいエントリが追加されるたびに配列を常に再割り当てすることはありません)。
Javaプラットフォームのソースコード は無料で入手できます。以下が抜粋です。
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Java.io.Serializable
{
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient E[] elementData;
.
.
.
}