リスト構造のクラス

この節の要点

  • Javaでリスト構造を表現したクラスとしてjava.utilパッケージにあるArrayListクラスがある。
  • リスト構造は、メモリが許す限り、データを連結しつづけることができるデータ構造である。

これまでによく使ってきたデータ構造として、配列がありました。

配列はメモリ消費が少なく簡潔なデータ構造ですが、データ抽象化の観点において問題がありますし、なにより配列サイズを動的に増やすにあたって既存のメモリ領域を拡張して増やすのではなく、新しくメモリ領域を確保しなおして増やすことになるため非効率です。

配列構造と似たデータ構造としてリスト構造があります。

現代的なプログラミング言語においては、一般的に配列よりもリスト構造を使うことが多いです。

配列が、変数宣言をした際にデータ構造の大きさ(すなわち配列の長さ)が固定される静的なデータ構造であることと対照的に、リスト構造は、変数宣言した際にデータ構造の大きさを指定する必要がない動的なデータ構造です。

リスト構造には様々な種類があるもののJavaにおいてはリスト構造はクラスとしてjava.utilパッケージに用意されており、最もよく使われるリスト構造のクラスとしてArrayListクラスが有名です。ArrayListクラスは図23でパッケージを読み込んだ後、図22のようにオブジェクトを作成して使うことが多いです。

ArrayList<Integer> sampleList = new ArrayList<Integer>();
図22:int型(Integer型)のデータを持つことができるArrayListオブジェクトの作成例
import java.util.ArrayList; // 先頭からクラス定義が始まる前までに記述される
図23:ArrayListクラスを使うためのjava.utilパッケージの読み込み

ArrayList<T>クラス型におけるTは内部で保持するデータ型であり、プリミティブ型の指定ができません。プリミティブ型にはそれに対応する参照型が存在するため、プリミティブ型を指定したい場合は対応した参照型を指定する必要があります。典型的な対応例を次に示します。

  • int 型(プリミティブ型) <-> Integer 型(参照型)
  • double 型(プリミティブ型) <-> Double 型(参照型)

つまり、もしdouble型のデータを保持するリストを使う場合は、図22をArrayList<Double>として指定してあげなければなりません。

ArrayListオブジェクトへデータを新しく追加するためには、boolean add(T e)メソッドを使います。addメソッドは、引数で与えられたデータを、リスト構造の末尾に付け加えます(図24)。

sampleList.add(3);
sampleList.add(1);
sampleList.add(4);
sampleList.add(1);
sampleList.add(5);
図24:boolean add(T e)メソッドの利用例

また、リストに格納されたデータは、図25のようにT get(int i)を使ってインデックスiを指定することで、取得できます。

System.out.println(sampleList.get(0));
図25:ArrayListオブジェクトを使ったリスト構造へのアクセス例

リストが持つ要素数は図26に示すようにint size()メソッドを使うことで取得できます。

System.out.println(sampleList.size());
図26:ArrayListオブジェクトが持つデータの要素数の返却例