java 集合框架(二)Iterable接口

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

相關文章
相關標籤/搜索