モジュール java.base
パッケージ java.util

クラスArrayList<E>

java.lang.Object
型パラメータ:
E - このリスト内に存在する要素の型
すべての実装されたインタフェース:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess, SequencedCollection<E>
直系の既知のサブクラス:
AttributeList, RoleList, RoleUnresolvedList

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
Listインタフェースのサイズ変更可能な配列実装。 オプションのリスト操作をすべて実装し、nullを含むすべての要素を許可します。 このクラスは、Listインタフェースの実装に加えて、リストの格納に内部的に使用される配列のサイズを操作するメソッドを提供します。 (このクラスは、非同期である点を除き、ほぼVectorと同等です。)

size, isEmpty, get, set, getFirst, getLast, removeLast, iterator, listIteratorおよびreversed操作は、一定時間で実行されます。 addおよびaddLast操作は、「償却定数時間」で実行されます。つまり、n個の要素requiresO(n)時間を追加します。 ほとんどの場合、ほかのすべての処理も比例的な時間で実行されます。 定数係数は、LinkedList実装の場合と比べて低くなります。

ArrayListインスタンスには、「容量」があります。 容量とは、リストの要素を格納するために使用する配列のサイズです。 これは常にリストのサイズ以上の大きさになります。 ArrayListに要素を追加すると、その容量は自動的に拡大します。 拡大のポリシーについては、要素を追加すると「一定の償却時間コスト」が伴うこと以外は、詳しくは指定されていません。

アプリケーションでは、ensureCapacity操作を使用して多数の要素を追加する前に、ArrayListインスタンスの容量を増やすことができます。 これにより、増加に対する再割当てが軽減される場合があります。

この実装はsynchronizedされません。 複数のスレッドが同時にArrayListインスタンスにアクセスし、1つ以上のスレッドがリストを構造的に変更する場合、外部で同期する必要があります。 構造的な変更とは、1つ以上の要素を追加または削除したり、基になる配列のサイズを明示的に変更したりする処理のことです。要素の値だけを設定する処理は、構造的な変更ではありません。 これは通常、リストを自然にカプセル化する一部のオブジェクトでsynchronizedすることによって達成されます。 そのようなオブジェクトが存在しない場合は、Collections.synchronizedListメソッドを使用してリストを「ラップ」するようにしてください。 リストが誤ってsynchronizedなしでアクセスされるのを防ぐために、作成時に行うことをお薦めします。

   List list = Collections.synchronizedList(new ArrayList(...));

このクラスのiteratorおよびlistIteratorメソッドによって返されるイテレータは、フェイルファストです。イテレータの作成後に、イテレータ自体のremoveまたはaddメソッド以外の方法でリストが構造的に変更されると、イテレータはConcurrentModificationExceptionをスローします。 このように、並行して変更が行われると、イテレータは、将来の予測できない時点において予測できない動作が発生する危険を回避するために、ただちにかつ手際よく例外をスローします。

通常、非同期の並行変更がある場合、確かな保証を行うことは不可能なので、イテレータのフェイルファストの動作を保証することはできません。 フェイルファスト・イテレータは、ベスト・エフォート・ベースでConcurrentModificationExceptionをスローします。 したがって、正確を期すためにこの例外に依存するプログラムを書くことは誤りです。イテレータのフェイルファストの動作はバグを検出するためにのみ使用すべきです。

このクラスは、Java Collections Frameworkのメンバーです。

導入されたバージョン:
1.2
関連項目: