【Java学習|豆知識】Javaエンジニア必修!Collection操作メソッドを使いこなしてコードを劇的に改善する

導入

Javaのコレクションフレームワークは、日々の開発で最も頻繁に使用する機能の一つです。しかし、addやremoveといった基本的なメソッドを「なんとなく」使っていると、予期せぬ例外(UnsupportedOperationExceptionなど)やパフォーマンスの低下を招くことがあります。本記事では、コレクション操作の基本を整理し、現場で即戦力となる使い分けのコツを解説します。

基礎知識

JavaのCollectionインタフェースは、ListやSetの基底となるインターフェースです。
add / addAll: 要素の追加。
remove / removeAll: 要素の削除。
retainAll: 引数に指定したコレクションに含まれる要素「以外」を削除(積集合)。
removeIf: 条件式(Predicate)に合致する要素を一括削除。
clear: 全要素の削除。
これらを使い分けることで、ループ処理を減らし、宣言的で可読性の高いコードを書くことが可能になります。

実装/解決策

現場で最も注意すべきは「イテレーション中の要素削除」です。for-eachループ内でremoveを直接呼ぶとConcurrentModificationExceptionが発生します。これを防ぐには、removeIfメソッド、またはイテレータを明示的に使用するのが定石です。

サンプルプログラム

以下は、リスト操作の基本と、安全な要素削除のサンプルです。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CollectionSample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("Java", "Python", "C++", "JavaScript"));

        // 1. 追加
        list.add("Go");
        list.addAll(Arrays.asList("Rust", "PHP"));

        // 2. removeIfによる安全な削除(例:文字数が3以下の言語を削除)
        // 従来のforループより圧倒的に簡潔で安全です
        list.removeIf(s -> s.length() <= 3);

        // 3. 保持する要素の指定(retainAll)
        // "Java"と"Python"以外を削除する
        list.retainAll(Arrays.asList("Java", "Python"));

        // 結果出力
        System.out.println("最終リスト: " + list);

        // 4. 全消去
        list.clear();
        System.out.println("消去後サイズ: " + list.size());
    }
}

応用・注意点

現場で遭遇しやすい落とし穴として、Arrays.asList()が返すリストは固定サイズであるという点があります。このリストに対してaddやremoveを行うとUnsupportedOperationExceptionが発生します。可変のコレクションが必要な場合は、必ずnew ArrayList<>(Arrays.asList(…))のようにラップしてください。

また、Java 21から導入されたSequenced Collections(ListやDequeなど)では、先頭や末尾へのアクセスがより直感的になりました。新しいバージョンのJavaを使う際は、これらの新機能を活用することで、より効率的なデータ操作が可能になります。基本メソッドをマスターし、状況に応じて最適な手法を選択する「判断力」を養いましょう。

コメント

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