4

私はこの定義を取得します:名前が示すように、イテレータは、反復が開始されてからコレクションの構造が変更されたことに気付くとすぐに失敗します。

反復が始まってからどういう意味ですか?Iterator it = set.iterator()の後、このコード行を意味しますか?

public static void customize(BufferedReader br) throws IOException{  
    Set<String> set=new HashSet<String>(); // Actual type parameter added  
    **Iterator it=set.iterator();**
4

5 に答える 5

9

まず第一に、それらはフェイルセーフではなく、フェイルセーフです。

契約では、特定のタイプのコレクションの構造変更(つまり、挿入/削除)により、コレクションへの既存のイテレーターが無効になります。フェイルファストイテレータは、それらが有効であるとは考えられていないことを検出し、をスローしようとしますConcurrentModificationException。これは、プログラマーであるあなたへのサービスとして行われ、このタイプのバグをより迅速に発見するのに役立ちます。

あなたの例では:

Iterator it = set.iterator();
it.next();
set.add("unique-entry"); // invalidates the iterator
it.next();

運が良ければ、2番目it.next()は無効な使用法を検出し、例外をスローします。これはベストエフォートベースで行われ、保証されないことに注意してください。

于 2012-11-25T09:57:32.433 に答える
2

Iterator it = set.iterator()の後、このコード行を意味しますか?

はい。コードを見ると、HashSet.iterator()これだけであることがわかります。

return map.keySet().iterator();

...どのデリゲートにHashMap.KeySet.iterator()。チェーンにはさらにいくつかのリンクがありますが、最終的にはに到達しHashMap.HashIteratorます。これには、コンストラクターにこれが含まれています。

private abstract class HashIterator<E> implements Iterator<E> {
    int expectedModCount;   // For fast-fail

    ...

    HashIterator() {
        expectedModCount = modCount;
        ...
    }
}

...ここで、は、変更の数を追跡modCountする、囲んでいるインスタンスのフィールドです。HashMap

于 2012-11-25T10:00:26.400 に答える
2

イテレータがフェイルファストであるということは、次のコードが失敗すると予想されることを意味します。

Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
set.add("");
it.next();   // the set has changed now, and the iterator will throw an exception

次の一連のイベントが発生するためです。イテレータが作成され、その基になるコレクションが変更されてから、イテレータにアクセスします。

于 2012-11-25T09:57:59.957 に答える
0

はい、.iterator()を使用した後にコレクションを変更しないでください。コレクションを反復処理する場合は、コレクションを変更しないでください。ただし、最新の要素を削除する場合は、.remove()を使用できます。

于 2012-11-25T09:58:54.440 に答える
0

Fail Fast Iteratorが動作を開始する前に、コレクションのカウントを取得し、反復後にカウントが変更されたかどうかをチェックします。カウントが変更された場合、JVMはConcurrentModificationExceptionをスローします。フェイルファストイテレータは、java.utilパッケージ(例:ArrayList、LinkedListなど)内にあるコレクションのイテレータであり、フェイルセーフイテレータは、java.concurrentパッケージ(例:CopyOnWriteArrayList、CopyOnWriteSetなど)内にあるイテレータです。フェイルファストイテレータは、同時変更の場合に例外をスローしますが、フェイルセーフイテレータは基本的に、同時変更の場合に例外をスローしないコレクションのコピーを処理します。

于 2018-05-10T22:20:14.853 に答える