java 集合框架(二)Iterable接口


  Iterable接口是java 集合框架的頂級接口,實現此接口使集合對象可以通過迭代器遍歷自身元素,我們可以看下它的成員方法

修飾符和返回值 方法名 描述
Iterator<T> iterator() 返回一個內部元素為T類型的迭代器
default void forEach(Consumer<? super T> action) 對內部元素進行遍歷,並對元素進行指定的操作
default Spliterator<T> spliterator() 創建並返回一個可分割迭代器

   Iterable最早出現在JDK 1.5,開始只有iterator()一個抽象方法,需要子類來實現一個內部迭代器Iterator遍歷元素.后兩個方法是Java 8后新添加的,forEach(Consumer action)是為了方便遍歷操作集合內的元素,spliterator()則提供了一個可以並行遍歷元素的迭代器,以適應現在cpu多核時代並行遍歷的需求.

  其中我們可以看下default修飾符,這也是Java 8后新出現的,我們知道,如果我們給一個接口新添加一個方法,那么所有他的具體子類都必須實現此方法,為了能給接口拓展新功能,而又不必每個子類都要實現此方法,Java 8新加了default關鍵字,被其修飾的方法可以不必由子類實現,並且由dafault修飾的方法在接口中有方法體,這打破了Java之前對接口方法的規范.

  下面是使用迭代器進行遍歷的例子

public class IterableTest {
    public static void main(String[] args) {
        iteratorCase();
    }
    public static void iteratorCase(){
        List<Integer> list=new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        Iterator<Integer> iterator=list.iterator();  //獲取ArrayList內部迭代器
        while(iterator.hasNext()){                   //hasNext()方法判斷是否還有元素
            System.out.println(iterator.next());     //next()返回當前元素,並且將指針移向下個元素
        }
    }
}

  此外我們還可以使用"for-each loop"形式進行遍歷,增強for形式在Java中只是一個語法糖,實際編譯的時候,還是會轉換為迭代器形式,上面方法體可以改成

for (Integer integer : list) {
         System.out.println(integer);
     }

   進行迭代遍歷的時候我們需要注意這種情況,就是在遍歷的過程中,如果我們對元素進行添加刪除,那么會造成並行修改異常(ConcurrentModificationException),如下

     Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer i = iterator.next();
            if (i == 2) {
                list.remove(i);
            }
        }

  對於這種情況,,我們應當使用迭代器Iterator內部的remove()方法,而不是使用集合list直接刪除元素,正確寫法為

Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer i = iterator.next();
            if (i == 2) {
                iterator.remove();            //使用迭代器進行刪除元素,注意這里remove()沒有參數,它是直接刪除當前迭代的元素
            }
        }

  如果我們自己想自己寫一個集合,實現Iterable接口,並可以使用"for-each loop"形式遍歷,那么我們需要自己來重寫一個迭代器(Iterator)並返回它,看下面代碼

public class MyCollection<E> implements Iterable<E> {
    @Override
    public Iterator iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E>{
        @Override
        public boolean hasNext() {
            return false;
        }
        @Override
        public E next() {
            return null;
        }
    }
}

  這樣就可以使用"for-each loop"的形式進行遍歷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM