Java - List インターフェースと関連クラス

List インターフェース

List インターフェースは、順序付きのオブジェクト集合を扱うための Java Collection Framework のインターフェースである。Java Collection Framework の最上位インターフェースである Collection インターフェースを継承しており、重複したデータを含めることができる。List インターフェースを実装した下位クラスには、ArrayList、LinkedList、Vector、Stack などがある。

  • List
    • ArrayList
    • LinkedList
    • Vector
      • Stack

List メソッド

メソッド 説明
void add(int index, E element) index にオブジェクト(element)を追加する。
boolean addAll(int index, Collection<? extends E> c) index にコレクションオブジェクトを追加する。
E get(int index) List の index 番目のオブジェクトを返す。
int indexOf(Object o) List の最初の要素から順方向に検索し、オブジェクト o の index(位置)を返す。List にオブジェクトがなければ -1 を返す。
int lastIndexOf(Object o) List の最後の要素から逆方向に検索し、オブジェクト o の index(位置)を返す。List にオブジェクトがなければ -1 を返す。
ListIterator<E> listIterator() List のオブジェクトにアクセスできる ListIterator を返す。
ListIterator<E> listIterator(int index) index から始まる List のオブジェクトにアクセスできる ListIterator を返す。
E remove(int index) index 番目のオブジェクトを削除し、削除されたオブジェクトを返す。
Object set(int index, E element) index 番目にオブジェクトを保存し、index 番目にあった以前のオブジェクトを返す。
List<E> subList(int fromIndex, int toIndex) fromIndex(含む)番目から toIndex(含まない)番目までの List オブジェクトを返す。

ListIterator インターフェース

ListIterator は Iterator を継承したインターフェースである。Collection が提供する Iterator インターフェースは、Collection を一方向に探索しながらオブジェクトに関する情報を取得する。ListIterator は List が提供するインターフェースであり、List に含まれるすべてのオブジェクトを双方向に探索しながら取り出す方法を提供する。 ListIterator を利用すると、双方向に移動しながら修正したり、Iterator の現在位置を確認したりできる。List を使用する場合は、Collection が提供する Iterator はもちろん、より拡張された機能を持つ ListIterator を使用できる。

ListIterator メソッド

メソッド 説明
boolean hasNext() Iterator の次方向にオブジェクトが存在するかどうかを返す。
boolean hasPrevious() Iterator の前方向にオブジェクトが存在するかどうかを返す。
Object next() Iteration で次のオブジェクトを返す。
Object previous() Iteration で前のオブジェクトを返す。
void remove() next() または previous() で返された最後のオブジェクトを削除する。
void set(Object o) next() または previous() で返された最後のオブジェクトを、入力されたオブジェクト(o)に変更する。
int nextIndex() Iteration で次のオブジェクトのインデックスを返す。
int previousIndex() Iteration で前のオブジェクトのインデックスを返す。
void add(Object o) List にオブジェクト(o)を追加する。

ArrayList クラス

ArrayList は、サイズを変更できる Array として実装されたクラスである。サイズが可変である点を除けば通常の Array と同じように使用でき、性能も同様である。random access が可能なため get()/set() の性能は良い一方、add()/remove() の性能は悪い。

ArrayList は動的にサイズが変更される。設定された初期サイズより多くのデータが保存されると自動的にサイズが大きくなり、保存されたデータが削除されると自動的にサイズが小さくなる。

ArrayList コンストラクタ

コンストラクタ 説明
ArrayList() デフォルトコンストラクタ。基本サイズのオブジェクトを生成する。
ArrayList(Collection<? extends E> c) Collection を入力として受け取り、オブジェクトを生成する。
ArrayList(int initialCapacity) 容量を指定してオブジェクトを生成する。

ArrayList の例

package com.devkuma.tutorial.java.util;

import java.util.ArrayList;
import java.util.List;

public class ArrayListClass {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();

        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        list.add("F");

        System.out.println("list :" + list);
        System.out.println("size : " + list.size());
        System.out.println("get : " + list.get(0));

        list.set(2, "CC");
        System.out.println("set : " + list);

        list.add(1, "AA");
        System.out.println("add : " + list);

        list.remove(2);
        list.remove("F");
        System.out.println("remove : " + list);

        for (String str : list) {
            System.out.println("for : " + str);
        }
    }
}

実行結果は次のとおりである。

list :[A, B, C, D, E, F]
size : 6
get : A
set : [A, B, CC, D, E, F]
add : [A, AA, B, CC, D, E, F]
remove : [A, AA, CC, D, E]
for : A
for : AA
for : CC
for : D
for : E

LinkedList クラス

LinkedList は doubly linked list として実装されたクラスである。List であるため、get()/set() の性能は良くない。

Vector クラス(Legacy)

java.util.Collection の Legacy クラスである Vector は ArrayList と同じである。違いは Vector が synchronized である点である。このため ArrayList と比べて性能面で不利である。多くの Java プログラマーは Vector の代わりに ArrayList を使用し、synchronized が必要な場合でさえ、明示的に ArrayList を synchronized する方法を好む。つまり、Vector クラスはあまり使用されないクラスである。

参考

http://hochulshin.com/java-collection-list/
http://scarlett.tistory.com/entry/자바공부-5List-인터페이스와-ListIterator-인터페이스