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を格納できます。
📖 まとめ
- ArrayListは配列ベースで、クエリが高速、挿入/削除が低速
- LinkedListは連結リストベースで、挿入/削除が高速、クエリが低速
- 一般的な操作:add/get/set/remove/contains/sort
- 走査方法:for/for-each/Iterator/Lambda
📝 演習
- 重複排除: ArrayListから重複する要素を削除
- マージ: 2つのソート済みListを1つのソート済みListにマージ
- カウント: List内の各要素の出現回数をカウント
次のレッスン
次のレッスンでは、SetとHashSetを学びます — Setの重複排除メカニズムを理解します。



