JavaのIterator(イテレータ)入門:コレクションを順番に取り出す方法
こんにちは。ゆうせいです。
今回は、新人エンジニアの皆さんに向けてJavaの「Iterator(イテレータ)」について解説します。
Iteratorは、コレクション(ListやSetなど)に格納された要素を1つずつ取り出すための仕組みです。
「拡張for文でループできるのに、Iteratorを使う意味ってあるの?」
そんな疑問にも、しっかり答えていきますよ!
Iteratorとは何か?
イテレータは「繰り返し処理の専用ツール」
JavaのIterator
は、コレクションを「次の要素があるか?」「次の要素は何か?」と確認しながら進める道具です。
イメージ:
ガチャポンのカプセルを一つずつ取り出していく機械。
「まだある? → あったら次を出す!」という仕組みがIterator。
Iteratorの基本構造
インターフェースの定義(覚えるのはこの3つ)
public interface Iterator<E> {
boolean hasNext(); // 次の要素があるか?
E next(); // 次の要素を返す
void remove(); // 今取り出した要素を削除(任意)
}
Iteratorの使い方:基本例
List<String> fruits = Arrays.asList("りんご", "バナナ", "みかん");
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
実行結果:
りんご
バナナ
みかん
Iteratorとfor-eachの違い
for (String fruit : fruits) {
System.out.println(fruit);
}
このfor-each文
の裏側で、実はIteratorが使われているんです。
じゃあ、なぜ明示的にIteratorを使う?
答え:
要素を削除したいとき、Iteratorを使わないとエラーになる!
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
if (s.equals("B")) {
it.remove(); // 安全に削除できる!
}
}
System.out.println(list); // [A, C]
拡張for文で削除するとどうなる?
for (String s : list) {
if (s.equals("B")) {
list.remove(s); // 例外発生!ConcurrentModificationException
}
}
結論:
- 削除したいならIteratorを使え!
- 読み取りだけならfor-eachでOK!
SetやMapでも使える?
SetももちろんOK!
Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z"));
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Mapは少し工夫が必要!
Map<String, String> map = new HashMap<>();
map.put("apple", "りんご");
map.put("banana", "バナナ");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println(entry.getKey() + " → " + entry.getValue());
}
Iteratorのメリット・デメリット
項目 | 内容 |
---|---|
メリット | 要素を安全に削除しながらループ可能、すべてのコレクションで使える |
デメリット | 記述がやや冗長、読み取りだけならfor-eachのほうが簡単 |
図で理解するIteratorの動き
List: [A] → [B] → [C]
Iteratorの動作:
1. hasNext() → true
2. next() → "A"
3. hasNext() → true
4. next() → "B"
remove() → Bを削除
5. hasNext() → true
6. next() → "C"
7. hasNext() → false
Iterator以外の反復手段も学ぼう!
方法 | 特徴 |
---|---|
拡張for文 | シンプルに全要素を走査 |
forEach() メソッド | Java 8以降のラムダ式対応 |
ListIterator | 双方向に移動できるイテレータ(後述) |
Stream | 宣言的で強力な操作が可能(filter/mapなど) |
今後の学習のステップ
ListIterator
で「後ろにも戻れる」イテレータを学ぼう!Iterable
インターフェースを実装して、自作のクラスでもfor-eachを使えるように!Stream API
との使い分けも理解しよう!
Iteratorは、コレクション操作の「基本のキ」です。
しっかり理解して、安心してコレクションを操作できるようになりましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
