Iterable接口是java 集合框架的頂級接口,實現此接口使集合對象能夠經過迭代器遍歷自身元素,咱們能夠看下它的成員方法html
修飾符和返回值 | 方法名 | 描述 |
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多核時代並行遍歷的需求.java
其中咱們能夠看下default修飾符,這也是Java 8後新出現的,咱們知道,若是咱們給一個接口新添加一個方法,那麼全部他的具體子類都必須實現此方法,爲了能給接口拓展新功能,而又沒必要每一個子類都要實現此方法,Java 8新加了default關鍵字,被其修飾的方法能夠沒必要由子類實現,而且由dafault修飾的方法在接口中有方法體,這打破了Java以前對接口方法的規範.api
下面是使用迭代器進行遍歷的例子oracle
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),以下ide
Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer i = iterator.next(); if (i == 2) { list.remove(i); } }
對於這種狀況,,咱們應當使用迭代器Iterator內部的remove()方法,而不是使用集合list直接刪除元素,正確寫法爲oop
Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer i = iterator.next(); if (i == 2) { iterator.remove(); //使用迭代器進行刪除元素,注意這裏remove()沒有參數,它是直接刪除當前迭代的元素 } }
若是咱們本身想本身寫一個集合,實現Iterable接口,並可使用"for-each loop"形式遍歷,那麼咱們須要本身來重寫一個迭代器(Iterator)並返回它,看下面代碼spa
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"的形式進行遍歷指針