リスト

Javaにおけるデータ型と例外処理

Jim White

Java Developer

List インターフェース

  • List インターフェース(Collection のサブインターフェース)
    • 要素が順序付けられる
    • 重複を許可
  • List の実装はいくつかあります
    • 動作は概ね同じ
    • 実装により内部の管理方法が異なる
Javaにおけるデータ型と例外処理

List の実装

  • ArrayList:可変長でインデックス付き(配列のような)順序リスト

ArrayList はインデックス要素を持つ Java 配列に似ています

  • LinkedList:前後の要素へのリンクで接続されたリスト

LinkedList はポインタで接続されたオブジェクトのリストです

  • 実装に関わらず、追加・削除・変更の使い方は同じ
1 List の種類と詳細は https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html を参照
Javaにおけるデータ型と例外処理

ArrayList

  • new で生成し、ジェネリクスで要素型を指定
  • 末尾に追加: .add(object)
  • 取得: .get(index)
    • ArrayList は 0 始まりのインデックス
  • 置換: .set(index, object)
  • 削除: .remove(index)
  • 全消去: .clear()
  • 要素数: .size()
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // 重複可
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// 最初の horse を削除 animals.remove(0); // 全要素を削除 animals.clear();
animals.size();
Javaにおけるデータ型と例外処理

オブジェクトとプリミティブ

  • プリミティブをコレクションに入れるにはラッパーを使用
  • 追加時に自動でボクシングされます(オートボクシング)
    • オートボクシング:プリミティブを自動で対応ラッパーに包むこと
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 は自動で Integer に包まれて追加
  • オートボクシングはすべての Collections Framework で有効
Javaにおけるデータ型と例外処理

異種コレクション

  • Collections Framework のデータ構造は異種型を扱えます(heterogeneous)
    • 異種型=異なる型のオブジェクトを保持
    • パラメータ化型に Object を使う
ArrayList<Object> list = new ArrayList<Object>(); // 任意のオブジェクト可
list.add(new Integer(5)); // Integer を追加
list.add(6); // オートボクシングで Integer を追加
list.add("Hello"); // String を追加
Javaにおけるデータ型と例外処理

List のループ

  • List の要素は拡張 for 構文で反復します
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // 拡張 for で全要素を走査
    System.out.println(animal);
}
horse
cow
chicken
Javaにおけるデータ型と例外処理

List の println

  • ArrayList などの Listprintln で内容を表示できます
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // すべての要素を表示

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // すべての要素を表示
[horse, cow, chicken]
[5, Hello]
Javaにおけるデータ型と例外処理

LinkedList

  • LinkedListArrayList と同様に生成します
  • メソッドは ArrayList と同じです
import java.util.LinkedList;
...
LinkedList<String> cars // 新しい ... を作成
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // 追加
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // 置換
System.out.println(cars); // 表示
cars.remove(0); // 削除
cars.clear();  // 全削除
cars.size(); // 要素数
[Ford, Toyota]
Javaにおけるデータ型と例外処理

LinkedList の追加メソッド

  • 追加のメソッド
    • addFirst() 先頭に追加
    • addLast() 末尾に追加
    • removeFirst() 先頭を削除
    • removeLast() 末尾を削除
cars.addFirst("Fiat"); // 先頭に追加
cars.addLast("BMW"); // 末尾に追加
cars.removeFirst(); // 先頭を削除
cars.removeLast(); // 末尾を削除
Javaにおけるデータ型と例外処理

コレクション型の共通点

  • ArrayListLinkedList は見た目が似ています
    • 他の Collections Framework 型も類似点があります
    • これは意図的です
  • 共通のインターフェースは List です
    • 多態性(polymorphism)の例
Javaにおけるデータ型と例外処理

ArrayList と LinkedList の比較

  • ArrayListLinkedList(任意の List)の操作は同じ
    • どの List を選ぶかは用途次第
  • ArrayList のポイント:
    • ランダムアクセスが速い(例: list.get(11)
    • 中央での追加・削除は遅い
    • 追加/削除時に要素を物理的に移動するため

ArrayList の中央に追加すると多くの移動が必要

Javaにおけるデータ型と例外処理

ArrayList と LinkedList の比較

  • LinkedList のポイント:
    • ランダムアクセスは遅い(例: list.get(11)
    • 中央での追加・削除は速い
    • 物理移動は不要で参照を更新するだけ

LinkedList の中央に追加するとポインタ更新のみ

Javaにおけるデータ型と例外処理

Passons à la pratique !

Javaにおけるデータ型と例外処理

Preparing Video For Download...