イテレータ(反復子)コレクション要素のコレクションをトラバース

イテレータ(反復子)インターフェースであるが、その役割は、すべてのコンテナのメンバーの要素だけでなく、Javaのコレクションフレームワークを横断するが、それと地図コレクションシリーズコレクションは同じではありません、と地図コレクションシリーズは、主に他のオブジェクトのコレクションを格納するために使用され、反復子は、主に(すなわち、反復)コレクションコレクション要素を横断するために使用されます。

実装クラスコレクションの反復子インタフェース皮革根本的な詳細は、コレクションは、アプリケーションへの統一プログラミング・インターフェースを通過する要素のコレクションを提供しています。反復子は、次の4つの方法で定義されたインターフェース。

	boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回 true。
	
	Object next():返回集合里的下一个元素。
	
	void remove():删除集合里上一次 next 方法返回的元素。
	
	void forEachRemaining(Consumer action):这是 Java 8 为 Iterator 新增的默认方法,该方法可使用 Lambda 表达式来遍历集合元素。

反復子は、インターフェースの要素のセットを通って横断します。

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class IteratorTest {
    public static void main(String[] args) {
        // 创建一个集合
        Collection objs = new HashSet();
        objs.add("Java教程");
        objs.add("C语言教程");
        objs.add("python教程");
        // 调用forEach()方法遍历集合
        // 获取books集合对应的迭代器
        Iterator it = objs.iterator();
        while (it.hasNext()) {
            // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
            String obj = (String) it.next();
            System.out.println(obj);
            if (obj.equals("百度C语言")) {
                // 从集合中删除上一次next()方法返回的元素
                it.remove();
            }
            // 对book变量赋值,不会改变集合元素本身
            obj = "百度Python语言";
        }
        System.out.println(objs);
    }
}

唯一のイテレータオブジェクトを必要に応じて、イテレータが作成コレクションを、反復のコレクションがなければならない、上記のコードから見ることができます。イテレータ一切コレクション値は存在しません。

ご注意ください:イテレータは、イテレータオブジェクトあれば、それに関連付けられたCollectionオブジェクトがなければならない、Collectionオブジェクトに添付する必要があります。反復子は、コレクションに要素のコレクションを反復処理するために二つの方法を提供し、next()メソッドの戻り要素のコレクションに収集remove()メソッドによって削除することができます。

あなたは、コレクション要素がイテレータコレクションを使用してアクセスすると、コレクションの要素のコレクションを変更することはできません、次の()メソッドを削除する唯一の方法は、removeイテレータ()缶を通じて要素のコレクションを返し、それ以外の場合は、java.utilの「につながります。 ConcurrentModificationExceptionが「例外。次のプログラムでは、このことを示しています。

public class IteratorErrorTest {
    public static void main(String[] args) {
        // 创建一个集合
        Collection objs = new HashSet();
        objs.add("百度Java教程");
        objs.add("百度C语言教程");
        objs.add("百度C++教程");
        // 获取books集合对应的迭代器
        Iterator it = objs.iterator();
        while (it.hasNext()) {
            String obj = (String) it.next();
            System.out.println(obj);
            if (obj.equals("百度C++教程")) {
                // 使用Iterator迭代过程中,不可修改集合元素,下面代码引发异常
                objs.remove(obj);
            }
        }
    }
}

出力は次のようになります。

百度C++教程
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextNode(Unknown Source)
        at java.util.HashMap$KeyIterator.next(Unknown Source)
        at IteratorErrorTest.main(IteratorErrorTest.java:15)

15行目は、プログラムが実行時に例外がスローされますので、コレクションの中に変更するIteratorコレクションに設定されているコードのIteratorブロック内に位置しています。

ANイテレータは反復処理で設定を検出すると、高速故障(フェイルファスト)機構は、(通常、他のスレッドがプログラムを修正するために)修飾されている使用して、プログラムが直ちに代わり修飾を表示する、ConcurrentModificationExceptionが例外を発生させその結果、共有リソースに起因する潜在的な問題を避けるために。

	快速失败(fail-fast)机制,是 Java Collection 集合中的一种错误检测机制。

ご注意ください:上記の手順は、「百度C言語のチュートリアル」の文字列を削除するには、変更された場合、例外は発生しません。HashSetのとArrayListの背中などについて、削除要素は、異常な反復につながることができます。あなたは、コレクション内の特定の要素を削除する場合にのみ、クラスを実装するコードのセットによって決定された例外をスローしません。

公開された457元の記事 ウォン称賛94 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_45743799/article/details/104715828