Java : AbstractList - API使用例

AbstractList (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

このクラスは、Listインタフェースのスケルトン実装を提供し、配列のような「ランダム・アクセス」データ・ストアに連動するこのインタフェースを実装するのに必要な作業量を最小限に抑えます。

クラス構成

必要最低限の独自実装の例です。

class MyList extends AbstractList<String> {
    private final String[] values;

    MyList(String[] values) {
        this.values = Objects.requireNonNull(values);
    }

    @Override
    public String get(int index) {
        return values[index];
    }

    @Override
    public int size() {
        return values.length;
    }
}

final var list = new MyList(new String[]{"aaa", "bbb", "ccc"});
System.out.println(list); // [aaa, bbb, ccc]
System.out.println(list.size()); // 3
System.out.println(list.isEmpty()); // false

System.out.println("-- values --");
for (final var value : list) {
    System.out.println(value);
}

// 結果
// ↓
//-- values --
//aaa
//bbb
//ccc

関連記事:List(リスト)の基本


フィールド

protected int modCount

このリストの構造が変更された回数です。

class MyList extends AbstractList<String> {
    private final int MAX_SIZE = 5;
    private final String[] values = new String[MAX_SIZE];
    private int size;

    @Override
    public String get(int index) {
        return values[index];
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean add(String s) {
        if (size == MAX_SIZE) {
            throw new IllegalStateException();
        }

        size++;
        modCount++;
        values[size - 1] = s;
        return true;
    }
}

final var list = new MyList();
list.add("aaa");
list.add("bbb");

{
    final var iterator = list.iterator();
    System.out.println("-- iterator --");
    iterator.forEachRemaining(s -> {
        System.out.println(s);
    });

    // 結果
    // ↓
    //-- iterator --
    //aaa
    //bbb
}

{
    final var iterator = list.iterator();

    list.add("ccc");

    try {
        System.out.println("-- iterator --");
        iterator.forEachRemaining(s -> {
            System.out.println(s);
        });
    } catch (ConcurrentModificationException e) {
        System.out.println("ConcurrentModificationException!");
    }

    // 結果
    // ↓
    //-- iterator --
    //ConcurrentModificationException!
}

コンストラクタ

AbstractList ()

唯一のコンストラクタです。

class MyList extends AbstractList<String> {
    private final String[] values;

    MyList(String[] values) {
        this.values = Objects.requireNonNull(values);
    }

    @Override
    public String get(int index) {
        return values[index];
    }

    @Override
    public int size() {
        return values.length;
    }
}

final var list = new MyList(new String[]{"aaa", "bbb", "ccc"});
System.out.println(list); // [aaa, bbb, ccc]
System.out.println(list.size()); // 3
System.out.println(list.isEmpty()); // false

System.out.println("-- values --");
for (final var value : list) {
    System.out.println(value);
}

// 結果
// ↓
//-- values --
//aaa
//bbb
//ccc

メソッド

void add (int index, E element)

このリスト内の指定された位置に、指定された要素を挿入します(オプションの操作)。

final var src = List.of("a", "b", "c");
System.out.println(src); // [a, b, c]

{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    list.add(0, "A");
    System.out.println(list); // [A, a, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    list.add(1, "B");
    System.out.println(list); // [a, B, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    list.add(2, "C");
    System.out.println(list); // [a, b, C, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    list.add(3, "D");
    System.out.println(list); // [a, b, c, D]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    //list.add(4, "D"); // IndexOutOfBoundsException
}

boolean add (E e)

指定された要素をこのリストの最後に追加します(オプションの操作)。

final AbstractList<String> list = new ArrayList<>();
System.out.println(list); // []

System.out.println(list.add("a")); // true
System.out.println(list); // [a]

System.out.println(list.add("b")); // true
System.out.println(list); // [a, b]

System.out.println(list.add("c")); // true
System.out.println(list); // [a, b, c]

boolean addAll (int index, Collection<? extends E> c)

指定されたコレクション内のすべての要素を、このリストの指定された位置に挿入します(オプションの操作)。

final var src = List.of("a", "b", "c");
System.out.println(src); // [a, b, c]

{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.addAll(0, List.of("A1", "A2"))); // true
    System.out.println(list); // [A1, A2, a, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.addAll(1, List.of("B1", "B2", "B3"))); // true
    System.out.println(list); // [a, B1, B2, B3, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.addAll(2, List.of("C1", "C2", "C3", "C4"))); // true
    System.out.println(list); // [a, b, C1, C2, C3, C4, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.addAll(3, List.of())); // false
    System.out.println(list); // [a, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    //list.addAll(4, List.of("E")); // IndexOutOfBoundsException
}
final var src = List.of("a", "b", "c");
System.out.println(src);// [a, b, c]

final AbstractList<String> list = new ArrayList<>(src);

// Setは順序が保証されません。
System.out.println(list.addAll(3, Set.of("D1", "D2", "D3"))); // true
System.out.println(list); // [a, b, c, D3, D2, D1]

void clear ()

すべての要素をこのリストから削除します(オプションの操作)。

final AbstractList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

System.out.println(list); // [a, b, c]

list.clear();
System.out.println(list); // []

boolean equals (Object o)

指定されたオブジェクトがこのリストと等しいかどうかを比較します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list); // [a, b, c]

System.out.println(list.equals(List.of("a"))); // false
System.out.println(list.equals(List.of("a", "b"))); // false
System.out.println(list.equals(List.of("a", "b", "c"))); // true
System.out.println(list.equals(List.of("c", "b", "a"))); // false
final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list); // [a, b, c]

final var arrayList = new ArrayList<>(list);
System.out.println(arrayList); // [a, b, c]
System.out.println(list.equals(arrayList)); // true

final var linkedList = new LinkedList<>(list);
System.out.println(linkedList); // [a, b, c]
System.out.println(list.equals(linkedList)); // true
final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list); // [a, b, c]

// List以外はfalse
final var set = new LinkedHashSet<>();
set.add("a");
set.add("b");
set.add("c");

System.out.println(set); // [a, b, c]
System.out.println(list.equals(set)); // false

abstract E get (int index)

このリスト内の指定された位置にある要素を返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list); // [a, b, c]

//list.get(-1); // IndexOutOfBoundsException
System.out.println(list.get(0)); // a
System.out.println(list.get(1)); // b
System.out.println(list.get(2)); // c
//list.get(3); // IndexOutOfBoundsException
final AbstractList<Integer> list = new ArrayList<>();
Collections.addAll(list, 10, 20, 30, 40);
System.out.println(list); // [10, 20, 30, 40]

System.out.println(list.get(0)); // 10
System.out.println(list.get(1)); // 20
System.out.println(list.get(2)); // 30
System.out.println(list.get(3)); // 40

int hashCode ()

このリストのハッシュ・コード値を返します。

final AbstractList<String> list1 = new ArrayList<>();
Collections.addAll(list1, "a", "b", "c");
System.out.println(list1.hashCode()); // 126145

final AbstractList<String> list2 = new ArrayList<>();
Collections.addAll(list2, "A", "B", "C");
System.out.println(list2.hashCode()); // 94369

final AbstractList<Integer> list3 = new ArrayList<>();
Collections.addAll(list3, 1, 2, 3);
System.out.println(list3.hashCode()); // 30817

int indexOf (Object o)

指定された要素がこのリスト内で最初に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", "a", "b", "c");
System.out.println(list); // [a, b, c, a, b, c]

System.out.println(list.indexOf("")); // -1
System.out.println(list.indexOf("a")); // 0
System.out.println(list.indexOf("b")); // 1
System.out.println(list.indexOf("c")); // 2
System.out.println(list.indexOf("d")); // -1
System.out.println(list.indexOf("abc")); // -1

Iterator<E> iterator ()

このリスト内の要素を適切な順序で反復処理するイテレータを返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

final var iterator = list.iterator();
iterator.forEachRemaining(System.out::println);

// 結果
// ↓
//aaa
//bbb
//ccc

int lastIndexOf (Object o)

指定された要素がこのリスト内で最後に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", "a", "b", "c");
System.out.println(list); // [a, b, c, a, b, c]

System.out.println(list.lastIndexOf("")); // -1
System.out.println(list.lastIndexOf("a")); // 3
System.out.println(list.lastIndexOf("b")); // 4
System.out.println(list.lastIndexOf("c")); // 5
System.out.println(list.lastIndexOf("d")); // -1
System.out.println(list.lastIndexOf("abc")); // -1

ListIterator<E> listIterator ()

このリスト内の要素を適切な順序で反復処理するリスト・イテレータを返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

final var listIterator = list.listIterator();
listIterator.forEachRemaining(System.out::println);

// 結果
// ↓
//aaa
//bbb
//ccc

ListIterator<E> listIterator (int index)

リスト内の指定された位置で始まる、リスト内の要素を適切な順序で反復するリスト・イテレータを返します。

final AbstractList<String> list = new ArrayList<>();
Collections.addAll(list, "aaa", "bbb", "ccc");
System.out.println(list); // [aaa, bbb, ccc]

{
    final var ret = list.listIterator(0);
    ret.forEachRemaining(System.out::println);

    // 結果
    // ↓
    //aaa
    //bbb
    //ccc
}
{
    final var ret = list.listIterator(1);
    ret.forEachRemaining(System.out::println);

    // 結果
    // ↓
    //bbb
    //ccc
}
{
    final var ret = list.listIterator(2);
    ret.forEachRemaining(System.out::println);

    // 結果
    // ↓
    //ccc
}

E remove (int index)

このリスト内の指定された位置にある要素を削除します(オプションの操作)。

final var src = List.of("a", "b", "c");
System.out.println(src); // [a, b, c]

{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.remove(0)); // a
    System.out.println(list); // [b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.remove(1)); // b
    System.out.println(list); // [a, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.remove(2)); // c
    System.out.println(list); // [a, b]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    //list.remove(3); // IndexOutOfBoundsException
}

protected void removeRange (int fromIndex, int toIndex)

fromIndex (これを含む)からtoIndex (これを含まない)の範囲のインデックスを持つすべての要素をこのリストから削除します。

class MyList extends ArrayList<String> {

    MyList(Collection<String> c) {
        super(c);
    }

    @Override
    public void removeRange(int fromIndex, int toIndex) {
        super.removeRange(fromIndex, toIndex);
    }
}

final var src = List.of("a", "b", "c");
System.out.println(src); // [a, b, c]

{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(0, 1);
    System.out.println(list); // [b, c]
}
{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(0, 2);
    System.out.println(list); // [c]
}
{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(0, 3);
    System.out.println(list); // []
}

{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(1, 3);
    System.out.println(list); // [a]
}
{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(2, 3);
    System.out.println(list); // [a, b]
}
{
    final var list = new MyList(src);
    System.out.println(list); // [a, b, c]

    list.removeRange(3, 3);
    System.out.println(list); // [a, b, c]
}

E set (int index, E element)

リスト内の指定された位置にある要素を、指定された要素に置き換えます(オプションの操作)。

final var src = List.of("a", "b", "c");
System.out.println(src); // [a, b, c]

{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.set(0, "A")); // a
    System.out.println(list); // [A, b, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.set(1, "B")); // b
    System.out.println(list); // [a, B, c]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    System.out.println(list.set(2, "C")); // c
    System.out.println(list); // [a, b, C]
}
{
    final AbstractList<String> list = new ArrayList<>(src);
    System.out.println(list); // [a, b, c]

    //list.set(3, "D"); // IndexOutOfBoundsException
}

List<E> subList (int fromIndex, int toIndex)

このリストの、指定されたfromIndex (これを含む)からtoIndex (これを含まない)までの部分のビューを返します。

final AbstractList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");

System.out.println(list); // [a, b, c, d]

System.out.println(list.subList(0, 0)); // []
System.out.println(list.subList(0, 1)); // [a]
System.out.println(list.subList(0, 2)); // [a, b]
System.out.println(list.subList(0, 3)); // [a, b, c]
System.out.println(list.subList(0, 4)); // [a, b, c, d]
//list.subList(0, 5); // IndexOutOfBoundsException

// サブリストの変更は、本体のリストにも反映されます。
final var subList = list.subList(1, 3);
System.out.println(subList); // [b, c]
System.out.println(list); // [a, b, c, d]

subList.set(0, "X");
System.out.println(subList); // [X, c]
System.out.println(list); // [a, X, c, d]

subList.add("Y");
System.out.println(subList); // [X, c, Y]
System.out.println(list); // [a, X, c, Y, d]

subList.remove("c");
System.out.println(subList); // [X, Y]
System.out.println(list); // [a, X, Y, d]

AbstractCollectionで宣言されたメソッド

addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray, toString

Java API 使用例 : AbstractCollection」をご参照ください。

Collectionで宣言されたメソッド

parallelStream, removeIf, stream, toArray

Java API 使用例 : Collection」をご参照ください。

Iterableで宣言されたメソッド

forEach

Java API 使用例 : Iterable」をご参照ください。

Listで宣言されたメソッド

addAll, contains, containsAll, isEmpty, remove, removeAll, replaceAll, retainAll, size, sort, spliterator, toArray, toArray

Java API 使用例 : List」をご参照ください。


関連記事

ページの先頭へ