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"的形式進行遍歷