導入
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を使う際は、これらの新機能を活用することで、より効率的なデータ操作が可能になります。基本メソッドをマスターし、状況に応じて最適な手法を選択する「判断力」を養いましょう。

コメント