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

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

仕組み ArrayListとは / ArrayListの初期サイズ
  ArrayListとListの関係
初期値 要素に初期値をセットする
取得 要素を取得(get、for文、拡張for文、forEach)
  要素を検索(containsとindexOfの違い)
  中身が空か、要素数を取得(isEmpty/size)
更新 要素を追加・更新(add/set) / 要素を削除(remove/clear)
  リストを連結 (addAll)
使用 メソッドの引数と戻り値がリスト / リストの中にリストを定義

ArrayListとは

使用例

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

上記はArrayListクラスをインスタンス化してListインターフェイス型の変数aに代入しています。
この変数aは複数の値を持てるようになります。
<>はジェネリクスです。変数aの各値はStringであると宣言しています。

ArrayListの特徴

項目 説明
ArrayListの
変数のイメージ
要素 各項目を要素(element)といいます。
1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
要素の位置 要素の位置は、インデックス(添字)で管理します。上記図では[0]、[1]、[2]、[3]がインデックスです。インデックスは0から始まります。
インデックスを使用してランダムアクセス(特定の要素へのアクセス)するため速いです。
要素の追加と削除 追加と削除ができます。(配列は不可です)
最後尾に追加する場合は早いです。
要素の先頭や途中に追加/削除する場合はインデックスを振り直すため遅いです。
例:インデックスが0,1,2の要素があるとします。インデックスの0を削除してインデックスが1と2になった場合、インデックスを0と1に振り直す動きが発生します。
要素の順序 順序はあります。インデックスで管理します。
値の重複 値の重複は可能です。
スレッドセーフ スレッドセーフではありません。
導入時期 バージョン1.2で導入されました。

ArrayListの初期サイズ

ArrayList(int initialCapacity)

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

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

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

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

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

 

要素に初期値をセットする

package test1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Test1 {
    public static void main(String[] args) {
    	List<String> c = new ArrayList<>(Arrays.asList("赤","黄","青"));
    	c.add("オレンジ");
        System.out.println(c); //[赤, 黄, 青, オレンジ]
    }
}

8行目は、ArrayListのコンストラクタの引数にリストを指定しています。
※Arrays.asListはリストを返します。
9行目のように値の追加も可能です。

要素を取得(get、for文、拡張for文、forEach)

getメソッドは、要素の位置を指定して取得します。要素の位置は0から始まります。
for文とforEachはループで要素を順に取得します。

  List<String> c1 = new ArrayList<>(Arrays.asList("赤", "黄", "青"));

  // get
  System.out.println(c1.get(1)); // 黄

  // for文
  for (int i = 0; i < c1.size(); i++) {
  	System.out.println(c1.get(i)); // 赤 黄 青が出力される
  }

  // 拡張for文
  for (String a : c1) {
  	System.out.println(a); // 赤 黄 青が出力される
  }

  // forEachとラムダ式
  c1.forEach(a -> System.out.println(a));// 赤 黄 青

  // forEachとメソッド参照
  c1.forEach(System.out::println);// 赤 黄 青

4行目は、getメソッドで要素の位置を指定して要素を取得しています。
要素の位置は、赤=0、黄=1、青=2です。
7行目は、for文ですべての要素を取得しています。
12行目は、加算(i++)の表記がないfor文で拡張for文と呼ばれます。すべての要素を取得しています。
17行目の変数a以降はラムダ式です。forEachメソッドは、Java8で導入されました。
20行目のSystem.out::printlnは、メソッド参照です。

要素を検索(containsとindexOfの違い)

public boolean contains(Object o)
public int indexOf(Object o)

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

  List<String> c1 = new ArrayList<>(Arrays.asList("赤","黄","青"));
	
  // contains
  System.out.println(c1.contains("青")); // true
  System.out.println(c1.contains("白")); // false

  // indexOf
  System.out.println(c1.indexOf("青"));  // 2
  System.out.println(c1.indexOf("白")); // -1

 

中身が空か、要素数を取得(isEmpty/size)

public boolean isEmpty()
public int size()

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

  List<String> c1 = new ArrayList<>(Arrays.asList("赤","青"));
	
  System.out.println(c1.isEmpty()); //false
  System.out.println(c1.size()); //2
  c1.clear();
  System.out.println(c1.isEmpty()); //true
  System.out.println(c1.size()); //0

3行目は、isEmptyメソッドで空か真偽値を取得しています。中身があるのでfalseです。
4行目は、sizeメソッドで要素数を表示しています。
5行目は、clearメソッドですべての要素を削除しています。
6行目は、中身が空なのでtrueです。

要素を追加・更新(add/set)

boolean add(E e);
void add(int index, E element);
E set(int index, E element);

addメソッド(引数1つ)は最後尾に要素を追加します。
addメソッド(引数2つ)は指定の位置に要素を追加します。
setメソッドは要素を置き換えます。

  List<String> c1 = new ArrayList<>(Arrays.asList("赤","黄","青"));
    
  // addで追加
  c1.add("緑");
  System.out.println(c1);//[赤, 黄, 青, 緑]
    
  // addで指定の位置に追加
  c1.add(1,"オレンジ");
  System.out.println(c1);//[赤, オレンジ, 黄, 青, 緑]
    
  // setで置き換え
  c1.set(1, "シルバー");
  System.out.println(c1); //[赤, シルバー, 黄, 青, 緑]

要素の位置は、赤=0、黄=1、青=2です。

要素を削除(remove/clear)

public E remove(int index)
public void clear()

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

  List<String> c1 = new ArrayList<>(Arrays.asList("赤","黄","青"));
	
  c1.remove(0);
  System.out.println(c1); //[黄, 青]
  System.out.println(c1.get(0)); //黄

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

要素の位置は、赤=0、黄=1、青=2です。

リストを連結 (addAll)

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

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

  List<String> a1 = new ArrayList<>(Arrays.asList("a","b"));
  List<String> b1 = new ArrayList<>(Arrays.asList("あ","い"));
    
  a1.addAll(b1);
    
  System.out.println(a1); // [a, b, あ, い]
  System.out.println(b1); // [あ, い]

 

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

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

  private static List<String> getColor(List<String> c1) {
      return c1;
  }

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

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

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

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

  List<String> list2 = new ArrayList<>();
  list2.add("赤");
  list2.add("黄");
  list2.add("青");

  List<String> list3 = new ArrayList<>();
  list3.add("red");
  list3.add("yellow");
  list3.add("blue");

  list1.add(list2);
  list1.add(list3);

  System.out.println(list1.get(0)); //[赤, 黄, 青]
  System.out.println(list1.get(0).get(0)); //赤
  System.out.println(list1.get(0).get(1)); //黄
  System.out.println(list1.get(0).get(2)); //青
  System.out.println(list1.get(1).get(0)); //red    
  System.out.println(list1.get(1).get(1)); //yellow
  System.out.println(list1.get(1).get(2)); //blue

1行目は、リストの中にリストを定義しています。
3~6と8~11行目は、通常のリストを作成しています。
13,14行目は、リストにリストを追加しています。

関連の記事

Java LinkedListの使い方のサンプル

△上に戻る