Java ArrayListとListの使い方のサンプル

仕組み ArrayListとは
  ArrayListの特徴
  ArrayListの初期サイズ
  ArrayListとListインターフェースの関係
サンプル ArrayListを使用するサンプル
インスタンス生成と同時に要素もセット
取得 要素を取得(get)
要素を取得(for文)
要素を取得(拡張for文)
要素を取得(forEach+ラムダ式)
要素を取得(forEach+メソッド参照)
要素数が0の場合
  要素を検索し真偽値を返す(contains)
  要素を検索し位置を返す(indexOf)
  中身が空か(isEmpty)
  要素数を取得(size)
更新 最後尾に要素を追加(add)
指定の位置に要素を追加(add)
指定の位置の要素を置き換え(set)
指定の要素を削除(remove)
全ての要素を削除(clear)
  リストを連結 (addAll)
使用 メソッドの引数と戻り値がリスト
リストの中にリストを定義

ArrayListとは

List<String> color = new ArrayList<>();
color.add("red");
color.add("blue");
System.out.println(color.get(0)); // red

1つの変数で複数の値を保持できます。

上記はArrayListクラスをインスタンス化してListインターフェイス型の変数に代入しています。
この変数colorは複数の値(redとblue)を持てるようになります。
<>はジェネリクスです。変数colorの各値はStringのみセット可能です。

 

ArrayListの特徴

ArrayListの変数のイメージ

 

要素

各項目を要素(element)といいます。
1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。

 

要素へのアクセス

要素の位置は、インデックス(添字)で管理します。
上記図では[0]、[1]、[2]、[3]がインデックスです。インデックスは0から始まります。
インデックスを使用してランダムアクセス(特定の要素へのアクセス)するため速いです。

 

要素の追加と削除

追加と削除ができます。(配列は不可です)
最後尾に追加する場合は早いです。
要素の先頭や途中に追加/削除する場合はインデックスを振り直すため遅いです。

例:インデックスが0,1,2の要素があるとします。インデックスの0を削除してインデックスが1と2になった場合、インデックスを0と1に振り直す動きが発生します。

 

その他

順序はあります。インデックスで管理します。
値の重複は可能です。
スレッドセーフではありません。

以下はOracleのJava8 API仕様のArrayListクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html

 

ArrayListを使用するサンプル

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

public class Test1 {
	public static void main(String[] args) {
		List<String> list1 = new ArrayList<>();
		list1.add("a");
		list1.add("b");
		System.out.println(list1); // [a, b]
	}
}

6行目は、Listインターフェイス型の変数にしています。
要素は、addで追加します。

6行目にListとArrayListを使用しているので、1,2行目にimportが必要です。

 

インスタンス生成と同時に要素もセット

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
			
  System.out.println(c1); // [a, b, c]

インスタンス生成と同時に要素もセットされます。

 

要素を取得(get)

getは、要素の位置を指定して取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));

  System.out.println(c1.get(0)); // a
  System.out.println(c1.get(1)); // b
  System.out.println(c1.get(2)); // c

要素の位置は0から始まります。

 

要素を取得(for文)

for文はループで要素を順に取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));

  for (int i = 0; i < c1.size(); i++) {
    System.out.println(c1.get(i)); // a b cが出力される
  }

要素の位置は0から始まります。size()で要素数を取得します。

 

要素を取得(拡張for文)

for文はループで要素を順に取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));

  for (String str : c1) {
    System.out.println(str); // a b cが出力される
  }

拡張for文です。for文との違いは加算(i++)の表記がありません。

 

要素を取得(forEach+ラムダ式)

forEachはループで要素を順に取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));

  c1.forEach(str -> System.out.println(str));// a b cが出力される

変数str以降はラムダ式です。

 

要素を取得(forEach+メソッド参照)

forEachはループで要素を順に取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
		
  c1.forEach(System.out::println);// a b cが出力される

System.out::printlnはメソッド参照です。

 

要素数が0の場合

  List<String> c1 = new ArrayList<>();

  for (String str : c1) {
    System.out.println(str); //出力されない エラーにならない
  }

ループ対象のオブジェクトの要素数が0の場合で拡張for文の処理を行った場合、エラーにはならず、出力もされません。

 

要素を検索し真偽値を返す(contains)

public boolean contains(Object o)

containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
    		
  System.out.println(c1.contains("a")); // true (存在する)
  System.out.println(c1.contains("Z")); // false (存在しない)

 

要素を検索し位置を返す(indexOf)

public int indexOf(Object o)

indexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
    		
  System.out.println(c1.indexOf("b"));  // 1
  System.out.println(c1.indexOf("Z")); // -1 (存在しない)

 

中身が空か(isEmpty)

public boolean isEmpty()

isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
    		
  System.out.println(c1.isEmpty()); //false (中身あり)
  c1.clear(); // すべての要素を削除
  System.out.println(c1.isEmpty()); //true (中身なし)
  System.out.println(c1); //[]

 

要素数を取得(size)

public int size()

sizeメソッドは、要素数を返します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
    		
  System.out.println(c1.size()); //3

 

最後尾に要素を追加(add)

boolean add(E e);

addメソッド(引数1つ)は最後尾に要素を追加します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
  		
  c1.add("d");
  System.out.println(c1);// [a, b, c, d]

 

指定の位置に要素を追加(add)

void add(int index, E element);

addメソッド(引数2つ)は指定の位置に要素を追加します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
  		
  c1.add(1,"d");
  System.out.println(c1);//[a, d, b, c]

要素の位置は、a=0、b=1、c=2です。

 

指定の位置の要素を置き換え(set)

E set(int index, E element);

setメソッドは要素を置き換えます。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
  		
  c1.set(1,"d");
  System.out.println(c1);//[a, d, c]

要素の位置は、a=0、b=1、c=2です。

 

指定の要素を削除(remove)

public E remove(int index)

removeメソッドは指定の位置の要素を削除します。削除後のインデックスは前につまります。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
  		
  c1.remove(0); // 指定の位置の要素を削除
  System.out.println(c1); //[b, c]
  System.out.println(c1.get(0)); //b

要素の位置は、a=0、b=1、c=2です。

 

全ての要素を削除(clear)

public void clear()

clearメソッドはすべての要素を削除します。

  List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
  		
  c1.clear(); // すべての要素を削除
  System.out.println(c1); // []

要素の位置は、a=0、b=1、c=2です。

 

リストを連結 (addAll)

public boolean addAll(Collection<? extends E> c)

addAllメソッドはリストを連結します。

  List<String> list1 = new ArrayList<>(Arrays.asList("a","b"));
  List<String> list2 = new ArrayList<>(Arrays.asList("c","d"));
			    	    
  list1.addAll(list2); // リストを連結
			    	    
  System.out.println(list1); // [a, b, c, d]
  System.out.println(list2); // [c, d]

list1の後ろにlist2が追加されます。

 

メソッドの引数と戻り値がリスト

public class Test1 {
	public static void main(String[] args) {
		List<String> c1 = new ArrayList<>(Arrays.asList("a", "b"));
		List<String> c2 = getName(c1); // 呼び出し元(引数と戻り値はリスト)
		System.out.println(c2); // [a, b]
	}
	private static List<String> getName(List<String> c1) { // (呼び出し先)
		return c1;
	}
}

2行目は、呼び出し元のメソッドです。引数(実引数)と戻り値もリストです。
4行目は、定義されたメソッドです。引数(仮引数)と戻り値もリストです。

呼び出し元のメソッドの引数の変数名(a1)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。

 

リストの中にリストを定義

  List<List<String>> list1 = new ArrayList<>(); // リストの中にリストを定義

  List<String> list2 = new ArrayList<>();
  list2.add("a");
  list2.add("b");
  list2.add("c");

  List<String> list3 = new ArrayList<>();
  list3.add("d");
  list3.add("e");
  list3.add("f");

  list1.add(list2); // リストにリストを追加
  list1.add(list3); // リストにリストを追加

  System.out.println(list1.get(0)); //[a, b, c]
  System.out.println(list1.get(0).get(0)); //a getを2つ指定して取得
  System.out.println(list1.get(0).get(1)); //b
  System.out.println(list1.get(0).get(2)); //c
  System.out.println(list1.get(1)); //[d, e, f]
  System.out.println(list1.get(1).get(0)); //d    
  System.out.println(list1.get(1).get(1)); //e
  System.out.println(list1.get(1).get(2)); //f

 

ArrayListの初期サイズ

ArrayList(int initialCapacity)

ArrayListの要素数の初期サイズのデフォルト値は10です。
要素が追加されていくと自動的に拡張されていきます。

初期サイズは、ArrayListのコンストラクタの引数に指定します。
以下は初期サイズを30とした場合です。

List<String> color = new ArrayList<>(30);

 

ArrayListとListインターフェースの関係

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

ArrayListクラスはListインターフェースを実装しています。

使用例

List<String> a = new ArrayList<>();

ArrayListクラスをインスタンス化する時、ArrayListクラスの独自のメソッドを使用しない限り、Listインターフェイス型の変数にすることが多いです。
Listインターフェイスにあるメソッドを使用できます。

以下はOracleのJava8 API仕様のListインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

関連の記事

Java LinkedListの使い方のサンプル

△上に戻る