設計モード——反復器モード


反復器はオブジェクトであり、集約オブジェクト(データを格納するデータセットまたはコンテナ)を遍歴できる方法を提供し、開発者は反復器を利用してデータ要素を取得する過程で、コンテナの下位実装を理解する必要がなく、同時にオブジェクトの内部詳細方法を暴露することもない.1、容器の使用について主に3つの方面があります:(1)容器のiterator()方法を使って返すのは1つの反復器Iteratorで、Iteratorのnext()方法を通じて次の要素(2)IteratorのhasNext()方法を返して、容器の中に元素があるかどうかを判断して、もしあるならば、するとnext()メソッドで取得する(3)remove()メソッドでコンテナから返される要素を削除し、コンテナから直接削除するのではなくIteratorを使用してlistの要素:IteratorListを取得する.java
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorList {
    public static void main(String[] args){
        ArrayList al = new ArrayList();
        al.add( "a" );
        al.add( "b" );
        al.add( "c" );
        Iterator it = al.iterator();
        while (it.hasNext()){
            System.out.print( it.next()+"\t" );
        }
    }
}

出力:
a	b	c

リストにはIteratorの派生メンバーも存在し、ListIteratorとListIteratorの違い:Iteratorは集合を順方向に遍歴するしかなく、移動要素を取得するのに適している.ListIteratorはIteratorから継承され、リストに特化しており、要素の変更をサポートしながらリストを2つの方向から巡回することができます.Iteratorを使用してMapのkey,value値:IteratorMapを取得します.java
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class IteratorMap {
    public static void main(String[] args){
        HashMap map = new HashMap(  );
        map.put( "aa", 9);
        map.put( "bb",10 );
        map.put( "cc",11 );
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()){
            Map.Entry entry = (Map.Entry) it.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println( key + "\t" + value );
        }
    }
}

出力:
aa	9
bb	10
cc	11

Mapでは、Iteratorを使用して、まずMapのオブジェクトをsetセットに配置してから、反復器を使用して2、iterator()メソッドでよく見られる例外を取得します.C o n c u r r e n tModificationException異常C o n c u r e ntModificationException異常は、通常、コンテナを遍歴しながらコンテナに要素を削除したり、マルチスレッドによって発生したりします.すなわち、あるスレッドが反復器を使用してコンテナの要素を遍歴すると、別のスレッドがコンテナを削除します.IteratorException.java
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorException {
    public static void main(String[] args){
        ArrayList al = new ArrayList();
        al.add( "a" );
        al.add( "b" );
        al.add( "c" );
        al.add( "e" );
        Iterator it = al.iterator();
        while (it.hasNext()){
            Object obj = it.next();
            System.out.println( obj );
            if (obj.equals( "c" )){
                al.add( "d" );
            }
        }
    }
}

異常出力:
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at IteratorException.main(IteratorException.java:13)
a	
b	
c 

理由:コンテナを呼び出すiterator()メソッドがIteratorオブジェクトを返すと、コンテナに含まれるオブジェクトの個数を変数expectedModCountに割り当て、next()メソッドを呼び出すと、expectedModCount変数は実際のオブジェクト個数modCountと比較され、等しくなければConcurrentModificationException異常が放出される.a.単一スレッド解決方法:<1>遍歴中にオブジェクトを1つのセットに格納し、遍歴終了後、removeAll()メソッドを呼び出して削除する.<2>itを使用します.remove()メソッドb.マルチスレッドを削除するC o n c u r r e ntModificationException異常:<1>JDK 1.5 ConcurrentHashMapやCopyOnWriteArrayListなどのスレッドセキュリティコンテナを導入し、非スレッドセキュリティコンテナ<2>の代わりにスレッドセキュリティコンテナを使用してコンテナを巡る場合はsynchronizedコードブロックに入れることができるが、プログラムの性能に深刻な影響を及ぼす