1. 導入
Java開発において、最も頻繁に使用されるデータ構造の一つが「リスト」です。`java.util.List`インターフェースは、データを順序立てて保持し、重複を許容するという特性を持っています。なぜこれが重要かというと、データベースから取得したレコードの並び順を維持したり、ユーザーの入力履歴を管理したりといった「順序が意味を持つデータ」を扱う際に必須だからです。この基本を正しく理解することで、コレクション操作のバグを未然に防ぎ、可読性の高いコードを書くことが可能になります。
2. 基礎知識
`List`インターフェースは、`java.util.Collection`を継承しており、主に以下の特徴を持っています。
・順序性: 要素を追加した順番が保持され、インデックス(添字)を使って要素にアクセスできます(0から始まります)。
・重複許容: 同じ値を複数格納することが可能です。
・実装クラス: 主な実装として、高速なランダムアクセスが可能な`ArrayList`と、要素の追加・削除が頻繁な場合に有利な`LinkedList`があります。現場では、特別な理由がない限り、メモリ効率とアクセス速度に優れた`ArrayList`を選択するのが定石です。
3. 実装/解決策
リストを扱う際は、インターフェース型で変数を宣言し、実装クラスでインスタンス化するのがベストプラクティスです(ポリモーフィズムの活用)。これにより、将来的に実装クラスを変更する場合でも、修正範囲を最小限に抑えられます。また、Java 9以降であれば、`List.of()`メソッドを使って不変(イミュータブル)なリストを簡潔に生成することも可能です。
4. サンプルプログラム
以下は、`ArrayList`を使用した基本的なリスト操作の例です。
import java.util.ArrayList;
import java.util.List;
public class ListSample {
public static void main(String[] args) {
// Listインターフェースで宣言し、ArrayListで初期化
List
// 要素の追加
fruits.add("りんご");
fruits.add("みかん");
fruits.add("りんご"); // 重複も許容される
// インデックスを指定して取得
System.out.println("1番目の要素: " + fruits.get(0));
// 要素の削除
fruits.remove("みかん");
// 拡張for文で全要素を走査
System.out.println("--- リストの中身 ---");
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
5. 応用・注意点
現場で注意すべき点は、「リストの反復処理中に要素を削除・追加しない」ことです。これを実行すると`ConcurrentModificationException`が発生します。要素を削除したい場合は、`Iterator`を使用するか、Java 8以降であれば`removeIf`メソッドを使用するのが安全です。また、スレッドセーフな処理が必要な場合は、`Collections.synchronizedList`や、より高機能な`CopyOnWriteArrayList`を検討してください。基本を抑えつつ、状況に応じた実装クラスを選択できるようになりましょう。

コメント