【Java学習|豆知識】Javaエンジニア必見!Listインターフェースの主要メソッドを使いこなす効率的なデータ操作術

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 copy = new ArrayList<>(list.subList(0, 2));

また、sort()メソッドはリストを直接並び替えます(破壊的操作)。もし元のリストを維持したい場合は、一度コピーを作成してからソートを行うのが安全です。さらに、LinkedListを使用している場合、get()やindexOf()は要素数に比例して処理時間がかかる(O(n))ため、大量データの検索にはArrayListやHashSetを検討するなどの設計判断が重要です。

コメント

タイトルとURLをコピーしました