ListとArrayList

ArrayListは最も一般的に使用されるコレクションです。このレッスンでは、Listの詳細な使用方法を学びます。

ArrayList

ArrayListは配列ベースの動的配列です。

特徴

特徴 説明
順序あり 挿入順に要素を格納
重複許可 同じ要素を複数持てる
インデックスアクセス インデックスで要素にアクセス
動的成長 自動的に容量を拡張

ArrayListの作成

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

// 方法1:デフォルト容量
List<String> list1 = new ArrayList<>();

// 方法2:指定容量
List<String> list2 = new ArrayList<>(100);

// 方法3:他のコレクションから作成
List<String> list3 = new ArrayList<>(list1);

基本操作

要素の追加

JAVA
List<String> list = new ArrayList<>();

list.add("Alice");        // 末尾に追加
list.add("Bob");
list.add(0, "Charlie");   // 指定位置に追加

System.out.println(list);  // [Charlie, Alice, Bob]

要素の取得

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

String first = list.get(0);  // Alice
int size = list.size();       // 2

要素の変更

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

list.set(0, "Charlie");  // 最初の要素をCharlieに変更
System.out.println(list);  // [Charlie, Bob]

要素の削除

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

list.remove(0);           // インデックスで削除
list.remove("Bob");       // 内容で削除
System.out.println(list);  // [Charlie]

要素の検索

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

boolean has = list.contains("Bob");    // true
int index = list.indexOf("Charlie");   // 2
int lastIndex = list.lastIndexOf("Alice");  // 0

走査方法

方法1:forループ

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

for (int i = 0; i < list.size(); i++) {
    System.out.println(i + ": " + list.get(i));
}

方法2:for-each

JAVA
for (String name : list) {
    System.out.println(name);
}

方法3:Iterator

JAVA
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

方法4:Lambda

JAVA
list.forEach(name -> System.out.println(name));
list.forEach(System.out::println);

ソート

Collections.sort()の使用

JAVA
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(4);
numbers.add(1);
numbers.add(5);

Collections.sort(numbers);  // 昇順
System.out.println(numbers);  // [1, 1, 3, 4, 5]

Collections.sort(numbers, Collections.reverseOrder());  // 降順
System.out.println(numbers);  // [5, 4, 3, 1, 1]

Comparatorの使用

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

List<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");

// アルファベット順
names.sort((a, b) -> a.compareTo(b));
System.out.println(names);  // [Alice, Bob, Charlie]

// 長さ順
names.sort(Comparator.comparingInt(String::length));
System.out.println(names);  // [Bob, Alice, Charlie]

その他の一般的なメソッド

メソッド 説明
addAll(Collection) すべての要素を追加
removeAll(Collection) 一致するすべての要素を削除
retainAll(Collection) 共通部分を保持
clear() すべてクリア
isEmpty() 空かどうか
toArray() 配列に変換
subList(int, int) サブリストを取得

例:バッチ操作

JAVA
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");

List<String> list2 = new ArrayList<>();
list2.add("B");
list2.add("C");
list2.add("D");

// 和集合
List<String> union = new ArrayList<>(list1);
union.addAll(list2);
System.out.println("和集合: " + union);  // [A, B, C, B, C, D]

// 積集合
List<String> intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
System.out.println("積集合: " + intersection);  // [B, C]

// 差集合
List<String> diff = new ArrayList<>(list1);
diff.removeAll(list2);
System.out.println("差集合: " + diff);  // [A]
▶ 試してみよう

LinkedList

LinkedListは双方向連結リストベースのList実装です。

特徴

特徴 ArrayList LinkedList
基本構造 配列 双方向連結リスト
ランダムアクセス O(1) O(n)
先頭への挿入 O(n) O(1)
末尾への挿入 O(1) O(1)
メモリ使用量 少ない 多い(ポインタ)

LinkedList固有のメソッド

JAVA
LinkedList<String> linkedList = new LinkedList<>();

// 先頭/末尾の操作
linkedList.addFirst("A");
linkedList.addLast("B");
linkedList.addLast("C");

String first = linkedList.getFirst();
String last = linkedList.getLast();

linkedList.removeFirst();
linkedList.removeLast();

選択ガイド

シナリオ 推奨
頻繁なランダムアクセス ArrayList
頻繁な先頭への挿入/削除 LinkedList
一般的な使用 ArrayList

例:学生成績管理

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class StudentGrade {
    private String name;
    private int score;
    
    public StudentGrade(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    public String getName() { return name; }
    public int getScore() { return score; }
    
    @Override
    public String toString() {
        return name + ": " + score;
    }
    
    public static void main(String[] args) {
        List<StudentGrade> students = new ArrayList<>();
        students.add(new StudentGrade("Alice", 95));
        students.add(new StudentGrade("Bob", 88));
        students.add(new StudentGrade("Charlie", 92));
        students.add(new StudentGrade("David", 85));
        
        // スコア降順でソート
        students.sort((a, b) -> b.getScore() - a.getScore());
        System.out.println("スコア順:");
        students.forEach(System.out::println);
        
        // 最高スコアを見つける
        StudentGrade top = students.stream()
            .max(Comparator.comparingInt(StudentGrade::getScore))
            .orElse(null);
        System.out.println("最高: " + top);
        
        // 平均を計算
        double avg = students.stream()
            .mapToInt(StudentGrade::getScore)
            .average()
            .orElse(0);
        System.out.printf("平均: %.1f%n", avg);
    }
}

❓ よくある質問

Q ArrayListの初期容量はいくつですか?
A デフォルトは10です。おおよそのサイズがわかっている場合は、コンストラクタで指定してリサイズを減らしてください。
Q ArrayListのリサイズメカニズムは?
A 各リサイズで容量が1.5倍に増加します。
Q Listはnullを格納できますか?
A ArrayListとLinkedListの両方がnullを格納できます。

📖 まとめ

📝 演習

  1. 重複排除: ArrayListから重複する要素を削除
  2. マージ: 2つのソート済みListを1つのソート済みListにマージ
  3. カウント: List内の各要素の出現回数をカウント

次のレッスン

次のレッスンでは、SetとHashSetを学びます — Setの重複排除メカニズムを理解します。

100%