PR

【Java】Iteratorとは?hasNextとnextの使い方を初心者向けに解説

unDrawのProcessイラストを使いIteratorが要素を順番に処理することを表すアイキャッチ画像 Java

Iteratorは、コレクションの要素を順番に取り出すための共通の窓口です。

ArrayListやHashSetのようなコレクションは、中身の持ち方がそれぞれ違います。それでも『次の要素があるか確認し、あれば取り出す』という読み方を共通化するためにIteratorがあります。

まずは『hasNextで確認、nextで取り出す』の2語だけを押さえると、Iteratorのコードはかなり読みやすくなります。

この記事では、Iteratorの意味、Iterableとの違い、拡張for文との関係、removeでつまずきやすい点を初心者向けに整理します。

スポンサーリンク

まず結論:Iteratorは順番に取り出す道具

Iteratorは、一覧の中身を一つずつ進みながら読むためのインターフェースです。代表的なメソッドはhasNext()next()です。

次の図で、Iteratorがカーソルのように要素の間を進むイメージを確認してください。

Iteratorがコレクションの要素を順番に指しながら進むイメージ
Iteratorは、コレクションの要素を順番に読むためのカーソルとして理解できます。

Iteratorそのものは『データの箱』ではありません。箱の中を順番に読むための読み取り口だと考えると、ArrayListやHashSetとの役割の違いが分かりやすくなります。

hasNextとnextの読み方

Iteratorを使う基本形は、hasNext()で次があるかを確認し、next()で次の要素を取り出す流れです。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

List<String> names = new ArrayList<>();
names.add("Sato");
names.add("Suzuki");
names.add("Tanaka");

Iterator<String> iterator = names.iterator();

while (iterator.hasNext()) {
    String name = iterator.next();
    System.out.println(name);
}

hasNext()は確認、next()は取り出しです。この2つを逆に読んでしまうと、最後の要素を超えて取り出そうとしてエラーになることがあります。

次の図では、確認してから取り出す順番を見てください。

hasNextで次の要素を確認しnextで取り出すIteratorの処理フロー
hasNextは確認、nextは取り出しです。nextを呼ぶとIteratorの位置が進みます。

初心者のうちは、next()を呼ぶたびにIteratorの位置が進むと覚えておくと安全です。同じ要素を何度も返すのではなく、読み取り位置が次へ移動します。

Iterableとの違い

Iteratorとよく一緒に出てくるのがIterableです。Iterableは『Iteratorを作れるもの』、Iteratorは『実際に順番に取り出すもの』です。

用語役割イメージ
Iterableiterator()を持つ順番に読める対象
IteratorhasNext()next()で進む読み取りカーソル
拡張for文Iterableを簡単に回す構文読みやすい書き方

ListやSetが拡張for文で回せるのは、これらがIterableとして扱えるからです。コレクションの全体像はJavaコレクションフレームワークでも整理しています。

拡張for文との関係

普段はIteratorを直接書かず、拡張for文を使うことも多いです。拡張for文は、読みやすく書ける一方で、裏側では順番に要素を取り出す考え方につながっています。

for (String name : names) {
    System.out.println(name);
}

拡張for文の基礎はJavaのfor文で扱っています。Iteratorを理解すると、拡張for文が単なる省略記法ではなく『順番に読む構文』として見えるようになります。

次の比較図で、Iteratorを直接使う場合と拡張for文で読む場合の違いを整理してください。

Iteratorを直接使う書き方と拡張for文で読む書き方の比較
拡張for文は読みやすく、Iteratorは読み取り位置や削除操作を明示できます。

どちらも一覧を順番に読む考え方は同じです。Iteratorを直接使うのは、削除など読み取り途中の操作を明確に扱いたい場面で出てきます。

removeでつまずきやすいポイント

Iteratorにはremove()があります。ただし、いつでも自由に削除できるわけではありません。基本はnext()で返した最後の要素を削除する操作です。

Iterator<String> iterator = names.iterator();

while (iterator.hasNext()) {
    String name = iterator.next();
    if (name.startsWith("S")) {
        iterator.remove();
    }
}

次の図では、Iteratorで削除するときの注意点を確認してください。

Iteratorのremoveがnextで返した最後の要素を削除することを示す図
Iteratorのremoveは、nextで返した最後の要素を削除する操作として読みます。

繰り返し中に元のListを直接変更すると、意図しない動きや例外につながることがあります。削除したい場合は、Iteratorのremove()を使う意図をコード上で明確にしましょう。

Iteratorを使う場面

  • コレクションを順番に読みたい
  • 拡張for文の裏側を理解したい
  • 読み取り途中で安全に削除したい
  • ListやSetなど異なるコレクションを同じ考え方で読みたい

Iteratorは、コレクションの細かい実装を隠し、順番に読むための共通した操作を提供します。ArrayListの基本はArrayListの記事で、Setの考え方はHashSetの記事で確認できます。

実務コードで読むときのコツ

実務コードでIteratorが出てきたら、最初に見るべきなのは『何を担当しているのか』です。名前だけを暗記するより、値を順番に取り出すのか、処理を渡すのか、別の実行の流れを作るのかを日本語に直す方が理解しやすくなります。

次に、型、呼び出しているメソッド、戻り値の3つを順番に確認します。型を見ると役割の範囲が分かり、メソッドを見るとその行で何をしたいのかが分かり、戻り値を見ると次の処理へどうつながるかが分かります。

この記事の範囲では、細かい内部実装をすべて覚えることよりも、初見のコードで立ち止まらないことを優先しています。必要になったら公式APIを確認しながら、まずは代表的な書き方を読める状態を作りましょう。

チーム開発では、同じ目的を複数の書き方で実現できることがあります。そのため『この書き方だけが正解』と覚えるのではなく、なぜその場面でそのクラスやインターフェースが選ばれているのかを考えるのが大切です。

サンプルコードと実務コードでは情報量が違います。実務コードでは、変数名、メソッド名、例外処理、戻り値の受け渡しが同時に出てきます。読み始めで混乱したら、まずこのページで扱った最小コードまで戻し、1行ずつ役割を書き出すと整理できます。

判断に迷ったときの基準

Iteratorを使うべきか迷ったときは、先に目的を言葉にしてみます。目的が曖昧なままコードを書き始めると、似たクラスや似た構文との違いが見えなくなります。

確認すること見るポイント
扱いたい対象値、一覧、処理、実行の流れなど何を扱うのか
必要な操作取り出す、渡す、開始する、待つ、変換するなど何をしたいのか
既存記事との関係基礎文法、コレクション、インターフェース、ラムダ式のどれにつながるか
注意点順番、戻り値、例外、状態変更、実行タイミングなど見落としやすい点

この4点を先に確認すると、単なる暗記ではなく、コードを読むための判断軸ができます。初心者向けの記事でも、この判断軸まで持てると次の応用記事へ進みやすくなります。

練習問題

理解を確認するために、次の観点でサンプルコードを自分で説明してみてください。実行できる環境がある場合は、少し値を変えて結果がどう変わるかも試すと定着しやすくなります。

  • Iteratorは何を扱うために使われているか説明する
  • コードの中で一番重要なメソッドを1つ選び、役割を説明する
  • 既存記事で学んだ概念とどこがつながるか説明する
  • 初心者が間違えやすいポイントを1つ挙げ、回避方法を書く

練習では、正確な用語を最初から完璧に使う必要はありません。まずは『何を受け取り、何を実行し、どのタイミングで次へ進むのか』を自分の言葉で言えることを目標にしてください。

よくある疑問

最初から細かい仕様まで覚えるべき?

最初からすべてのメソッドや内部仕様を暗記する必要はありません。初心者の段階では、代表的な使い方、よくあるつまずき、既存記事とのつながりを押さえれば十分です。必要になったタイミングで公式APIを確認する習慣を作りましょう。

既存記事とは何が違う?

既存のArrayList記事やコレクションフレームワーク記事はデータ構造の使い方が中心です。この記事は、その中身を順番に取り出すIteratorの読み方に絞ります。

次に何を読めばよい?

次に読む記事は、本文末尾の内部リンクから選ぶのがおすすめです。基礎概念が不安なら親記事へ戻り、コードの応用を見たい場合は関連する文法やライブラリの記事へ進むと理解がつながります。

既存記事とあわせて読む順番

for文、ArrayList、HashSet、Iterator、Stream APIの順に読むと、繰り返し処理からコレクション走査、関数型の処理へ自然につながります。

公式情報と関連して読みたい記事

まとめ

Iteratorは、コレクションの要素を順番に取り出すための共通の窓口です。

  • Iteratorはデータの箱ではなく読み取りカーソル
  • hasNextで次があるか確認し、nextで取り出す
  • IterableはIteratorを作れる対象
  • 削除したい場合はremoveのタイミングに注意する

Iteratorを理解すると、拡張for文やコレクション処理の裏側が読みやすくなります。

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