JDK1.5新しい特性---forサイクルの強化

10051 ワード

強化forループを導入する理由:JDK 5以前のバージョンでは、配列または集合の要素を巡回し、配列の長さまたは集合の反復器を先に取得する必要があり、面倒です.したがって、JDK 5では、このような操作を簡略化するためにforループを強化する新しい構文が定義されています.拡張forループは、配列、またはIterableインタフェースを実装する集合クラスでのみ使用できます.
構文の形式:
for(        :         ){}

For eachは、コードをシンプルにし、メンテナンスを容易にするためです.
強化forサイクルの注意すべき詳細:1.反復器は遍歴した要素を操作することができ、強化forループを使用する場合、集合内の要素を操作することはできません.2.forサイクルと通常のforサイクルの違いを増やす.3.mapの遍歴.
forサイクルを強化する上で注意すべき事項:1.拡張forループの下部も反復器を使用して取得されますが、反復器の取得はjvmで完了し、反復器を取得する必要はありません.したがって、拡張forループ変数要素を使用する過程で、集合オブジェクトを使用して集合の要素の個数を変更することはできません.2.反復器遍歴要素と強化for循環変数要素の違い:反復器を使用して集合の要素を遍歴する場合は集合の要素を削除できますが、for循環変数集合の要素を強化する場合は、反復器のremoveメソッドを呼び出して要素を削除することはできません.3.通常forサイクルと強化forサイクルの違い:通常forサイクルには変数の目標がなくてもよく、強化forサイクルには必ず変数の目標がある.
public class App {

    public static void main(String[] args) {
        HashSet set = new HashSet();
        //    
        set.add("  ");
        set.add("  ");
        set.add("  ");

        /*
        //       Set   .
        Iterator it  = set.iterator();
        while(it.hasNext()){
            String temp = it.next();
            System.out.println("  :"+ temp);
            it.remove();
        }


        //    for    
        for(String item : set){
            System.out.println("  :"+ item);

        }



        /*    */
        int[] arr = {12,5,6,1};

        //   for       
        for(int i =  0 ; i"  :"+ arr[i]);
        }

        //    for    
        for(int item :arr){
            System.out.println("  :"+ item);
        }



        //  :       5 hello world.
        for(int i = 0 ; i < 5; i++){
            System.out.println("hello world");
        }
        */

        //  : Map      Iterable  ,  map          for  ,        for       Collection
        //    。
        HashMap map = new HashMap();
        map.put("001","  ");
        map.put("002","  ");
        map.put("003","  ");
        map.put("004","  ");
        Set> entrys = map.entrySet();
        for(Map.Entry entry  :entrys){
            System.out.println(" :"+ entry.getKey()+"  :"+ entry.getValue());
        }


    }

}

以上の例では、1つのクラスがIterableインタフェースを実装すれば、拡張forループを使用することができます.Iterableインタフェースを実装するクラスをカスタマイズできます.
package cn.jdk15;

import java.util.Iterator;

//         for  
class MyList implements Iterable{

    Object[] arr = new Object[10];

    int index = 0 ; //     

    public void add(Object o){
        arr[index++] = o;  // 
    }

    public int size(){
        return index;
    }

    @Override
    public Iterator iterator() {

        //        

        return new Iterator() {

            int cursor  = 0;

            @Override
            public boolean hasNext() {
                return cursor@Override
            public String next() {
                return (String) arr[cursor++];
            }

            @Override
            public void remove() {

            }
        };
    }
}

public class Demo {

    public static void main(String[] args) {
        MyList list = new MyList();
        list.add("  ");
        list.add("  ");
        list.add("  ");

        for(String item :list){
            System.out.println(item);
        }



    }

}

Iterableインタフェースを実装インタフェースのすべてのメソッドを実装するには、hasNext()、next()、remove()の3つのメソッドを実装します.jdkソースコードを参照して、クラスListクラスでIterableインタフェースを実装します.sun社がどのように書かれているかを見てみましょう.
 private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() { //hasNext  
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() { // next  
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;  //   1  
            return (E) elementData[lastRet = i];
        }

        public void remove() {//remove  
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

自分の定義したクラスの実際の状況に基づいて自分の方法を書くことができます.
2017年12月16日21:22:48