概要

Javaで要素数の変動が変動する配列が欲しいときに使うクラスの1つにArrayListがあります。これは要素を追加した順に並ぶようになっています。追加、取得、上書き、削除などを行うメソッドが用意されているのでここでその一部を見てみましょう。

add引数で指定した要素を1つ追加する。例: list.add(“Sample”)
get引数で指定した番号の要素を返す。 例: list.get(1)
set引数で指定した番号の要素を上書きする。 例: list.set(0, “Java”);
addAll引数でしてしたコレクション(ArrayListやHashSetなど)に含まれるすべての要素を追加する。例: list.add(otherList);
remove引数で指定した番号の要素を削除する。 例: list.remove(2);
remove上と同じ名前だが引数で指定した要素と同じ内容の要素を削除する。 例: list.remove(“Sample”)
sizeこのリストが持つ要素の数を返す。 例: list.size();
indexOf引数で指定した要素が何番目にあるか返す。なければ-1を返す。例: list.indexOf(“Sample”)
contains引数で指定した要素をこのリストが持っているか返す。例: list.contains(“Sample”)
subList引数で指定した範囲のコピーを作成する。コピーは元のリストと共有されているため、コピーを変更すれば元のリストにも影響があり、元のリストの変更もコピーに影響を与える。例: list.subList(1, 3);

ソースコード

下記プログラムではいろいろな操作を加えながらその変化の様子を見るための処理が書かれています。列挙の仕方も通常のfor文、拡張for文、Stream APIなどいくつかの方法で列挙できます。

import java.util.ArrayList;

public class ArrayListSample{
    public static void main(String... args){
        var list = new ArrayList<String>();
        
        //要素の追加
        list.add("Hello");
        list.add("World");
        list.add("Sample");
        
        //昔ながらのループで列挙
        for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i)); //i番目の要素を表示
        }
        
        System.out.println();
        
        //拡張for文で列挙
        for(var element : list){
            System.out.println(element);
        }
        
        System.out.println();
        
        //forEachで列挙
        list.forEach(System.out::println);
        
        System.out.println();
        
        System.out.println("要素数(xize()): " + list.size());
        
        System.out.println("Sampleの位置: " + list.indexOf("Sample"));
        
        System.out.println();
        System.out.println("サブリストを作成");
        
        var subList = list.subList(1, 3);
        subList.forEach(System.out::println);
        
        subList.add("TEST");
        
        System.out.println();
        System.out.println("サブリストにTESTを追加後に列挙");
        subList.forEach(System.out::println);
        
        System.out.println();
        System.out.println("subListは本体のコピーのため本体にも影響が出る");
        list.forEach(System.out::println);
        
        //本体リストの3番目の要素(ここではTEST)をJavaにする
        list.set(3, "Java");
        
        System.out.println();
        System.out.println("本修正を加えた本体リストを列挙");
        list.forEach(System.out::println);
        
        System.out.println();
        System.out.println("サブリストも変更されている");
        subList.forEach(System.out::println);
        
        //新しいArrayList作成
        var otherList = new ArrayList<String>();
        otherList.add("これは");
        otherList.add("サンプルプログラムです");
        
        System.out.println();
        System.out.println("新しく作成したArrayListの内容を列挙");
        otherList.forEach(System.out::println);
        
        list.addAll(otherList);
        
        System.out.println();
        System.out.println("addAll後の本体リスト");
        list.forEach(System.out::println);
        
        System.out.println();
        System.out.println("最初の要素を削除し列挙");
        list.remove(0);
        list.forEach(System.out::println);
        
        System.out.println();
        System.out.println("Sampleという要素を削除して列挙");
        list.remove("Sample");
        list.forEach(System.out::println);
        
        System.out.println();
        System.out.println("本体リストがJavaを含んでいるかどうか: " + list.contains("Java"));
        System.out.println("本体リストがSampleを含んでいるかどうか: " + list.contains("Sample"));
        
        System.out.println();
        System.out.println("最後にStream APIを使って正規表現でフィルターをかけて列挙");
        list.stream().filter(s -> s.matches("[A-Za-z]+")).forEach(System.out::println);
    }
}