1. 導入:なぜList操作の基本が重要なのか
Java開発において、Listは最も頻繁に使用するコレクションの一つです。しかし、APIが豊富な分、「どのメソッドがどの計算量で動作するのか」「副作用はあるのか」を意識せずに使うと、予期せぬバグやパフォーマンス低下を招くことがあります。本稿では、日常的に使うList操作メソッドの正しい使い方と、現場で役立つ実践的なテクニックを解説します。
2. 基礎知識:Listインターフェースの役割
Listは「順序付けられたコレクション」であり、各要素にインデックス(0から始まる番号)でアクセスできるのが最大の特徴です。Set(重複不可)やMap(キーと値のペア)とは異なり、重複を許容し、挿入した順番を保持します。Java 21からはSequenced Collectionsの導入により、先頭や末尾へのアクセスがより直感的になりましたが、まずは基本となるList操作をマスターすることが先決です。
3. 実装と解決策
各メソッドの役割を理解し、適切に使い分けることが重要です。
・get(int index): 特定の要素を取得します。
・set(int index, E element): 指定位置の要素を置き換えます。
・indexOf(Object o) / lastIndexOf(Object o): 指定要素の最初/最後の出現位置を検索します。
・subList(int from, int to): リストの一部を切り出します。注意:返されるリストは元のリストの「ビュー(参照)」であり、変更すると元にも影響します。
・replaceAll(UnaryOperator operator): 全要素を一括変換します。
・sort(Comparator c): リストを並び替えます。
4. サンプルプログラム
以下のコードは、上記メソッドを実用的に組み合わせた例です。コピー&ペーストして動作を確認してください。
import java.util.;
public class ListSample {
public static void main(String[] args) {
List list = new ArrayList<>(Arrays.asList("Java", "Python", "C++", "Java", "Ruby"));
// 1. 検索
int firstIndex = list.indexOf("Java"); // 0
int lastIndex = list.lastIndexOf("Java"); // 3
// 2. 変更と一括置換
list.set(2, "TypeScript"); // C++をTypeScriptに変更
list.replaceAll(s -> s.toUpperCase()); // 全て大文字に変換
// 3. 並び替え
list.sort(Comparator.naturalOrder()); // アルファベット順にソート
// 4. 部分リスト(ビューの取得)
List sub = list.subList(1, 3);
System.out.println("加工後のリスト: " + list);
System.out.println("部分リスト: " + sub);
}
}
5. 応用・注意点:現場で陥りやすい罠
実務で特に注意すべきは、subListが「ビュー」であることです。subListで取得したリストを編集すると、元のリストの内容も書き換わります。意図しない副作用を避けるには、新しいリストとしてコピーを作成しましょう。
例:List
また、sort()メソッドはリストを直接並び替えます(破壊的操作)。もし元のリストを維持したい場合は、一度コピーを作成してからソートを行うのが安全です。さらに、LinkedListを使用している場合、get()やindexOf()は要素数に比例して処理時間がかかる(O(n))ため、大量データの検索にはArrayListやHashSetを検討するなどの設計判断が重要です。

コメント