Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのIteratorとListIteratorの違いを徹底解説!使い方とサンプルコード付き

Javaでは、コレクション内の要素を順番に処理するための仕組みとして、Iterator(イテレータ)ListIterator(リストイテレータ)という2つのインターフェースが提供されています。この記事では、両者の違いやそれぞれの使い方を、実際のコード例とともにわかりやすく解説します。

IteratorとListIteratorの主な違い

IteratorはJavaのインターフェースの一つで、リストの要素を前方方向(先頭から末尾へ)のみ走査できます。一方、ListIteratorIteratorインターフェースを継承したインターフェースで、要素を前方・後方の両方向に走査できる点が大きな特徴です。

また、適用できるコレクションにも違いがあります。IteratorはList、Set、Queueなど幅広いコレクションで利用できるのに対し、ListIteratorはList型のコレクションでのみ使用可能です。

さらに、主要なメソッドも異なります。

  • IteratorhasNext()next()remove()
  • ListIteratoradd()hasNext()hasPrevious()previous()remove()

違いの比較表

項目IteratorListIterator
走査方向前方のみ前方・後方の両方
継承関係Iteratorを継承
対応コレクションList、Set、QueueListのみ
要素の追加不可可(add())

Iteratorの構文

public interface Iterator<E>

Iteratorの使用例

import java.util.*;
public class IteratorTest {
    public static void main(String[] args) {
        List<String> listObject = new ArrayList<String>();
        listObject.add("India");
        listObject.add("Australia");
        listObject.add("England");
        listObject.add("Bangladesh");
        listObject.add("South Africa");
        Iterator it = listObject.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

実行結果

India
Australia
England
Bangladesh
South Africa

この例では、iterator()メソッドでIteratorを取得し、hasNext()で次の要素が存在するかを確認しながら、next()で要素を一つずつ取り出しています。

ListIteratorの構文

public interface ListIterator<E> extends Iterator<E>

ListIteratorの使用例

import java.util.*;
public class ListIteratorTest {
    public static void main(String[] args) {
        List<String> listObject = new ArrayList<String>();
        listObject.add("Java");
        listObject.add("Selenium");
        listObject.add("Python");
        listObject.add("Java Script");
        listObject.add("Cloud Computing");
        ListIterator it = listObject.listIterator();
        System.out.println("前方向への走査:");
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("--------------------------------------------");
        System.out.println("後方向への走査:");
        while (it.hasPrevious()) {
            System.out.println(it.previous());
        }
    }
}

実行結果

前方向への走査:
Java
Selenium
Python
Java Script
Cloud Computing
-----------------------------------------------
後方向への走査:
Cloud Computing
Java Script
Python
Selenium
Java

このように、ListIteratorを使えば前方への走査が終わったカーソル位置からそのままhasPrevious()previous()を組み合わせて、逆順に要素をたどることができます。

まとめ

  • Iterator:前方方向のみの走査。List・Set・Queueなど幅広いコレクションで使える汎用的なインターフェース。
  • ListIterator:Iteratorを継承し、双方向の走査や要素の追加が可能。ただし対象はListのみ。

単純な順次処理ならIteratorで十分ですが、逆順走査や途中での要素追加が必要な場合はListIteratorを選択するとよいでしょう。用途に応じて適切に使い分けることで、より柔軟で読みやすいコードを実現できます。

  1. JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】

    JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用

  2. JavaのJSeparatorクラスとは?重要性と基本的な使い方を解説

    JSeparatorクラスとはJSeparatorは、Swingで提供されるコンポーネント同士を視覚的に区切るためのクラスです。水平または垂直の区切り線、あるいは余白(空白スペース)として表示され、GUIの見やすさと整理されたレイアウトを実現します。JSeparatorクラスの主な役割は、レイアウト内のコンポーネント間に区切り線を描画して分離することです。これにより、関連する項目をグループ化し、ユーザーインターフェース全体の可読性を高めることができます。メニューやツールバーへの区切り線の追加メニューやツールバーにセパレータを追加する最も簡単な方法は、JMenu、JPopupMenu、JTool