天道不一定酬所有勤
但是,天道只酬勤

設計模式(十四)——JDK中的迭代器模式

新專題:設計模式,我會在博客(http://www.057299.live)及微信公眾號(hollischuang)同步更新,歡迎共同學習。

上一篇介紹了迭代器模式,而且我們也提到,迭代器模式在JAVA的很多集合類中應用廣泛,本文就來看看JAVA源碼中是如何使用迭代器模式的。

以下這段代碼是JAVA中比較常見的,使用迭代器來遍歷List:

List<String> list = new ArrayList<>();
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

在上一篇文章中,我們介紹過迭代器模式中包括的幾個角色:

Iterator 抽象迭代器

ConcreteIterator 具體迭代器

Aggregate 抽象容器

Concrete Aggregate 具體容器

我們看看ArrayList在使用迭代器的時候是否也包含這些角色。

首先,具體的容器就不用說了,ArrayList類本身就是這個具體的容器類。我們看得到,ArrayList中包含一個iterator方法,該方法用來返回一個具體的迭代器。

在介紹這個具體的迭代器的實現之前,我們先來找找這個迭代器模式的實現中是否包含抽象迭代器和抽象容器。

抽象容器比較好找,只要我們找到這個iterator方法在哪個接口中定義的就可以了。這里直接給出答案:java.util.Iterable。

抽象迭代器就是java.util.Iterator

當我們在使用JAVA開發的時候,想使用迭代器模式的話,只要讓我們自己定義的容器類實現java.util.Iterable并實現其中的iterator方法使其返回一個java.util.Iterator的實現類就可以了。

我們接下來看一下ArrayList中的iterator方法是如何實現的,直接貼源碼(jdk1.8.0_73):

public Iterator<E> iterator() {
    return new Itr();
}

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() {
        return cursor != size;
    }

    @SuppressWarnings("unchecked")
    public E 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;
        return (E) elementData[lastRet = i];
    }

    public void 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();
        }
    }

    @Override
    @SuppressWarnings("unchecked")
    public void forEachRemaining(Consumer<? super E> consumer) {
        Objects.requireNonNull(consumer);
        final int size = ArrayList.this.size;
        int i = cursor;
        if (i >= size) {
            return;
        }
        final Object[] elementData = ArrayList.this.elementData;
        if (i >= elementData.length) {
            throw new ConcurrentModificationException();
        }
        while (i != size && modCount == expectedModCount) {
            consumer.accept((E) elementData[i++]);
        }
        // update once at end of iteration to reduce heap write traffic
        cursor = i;
        lastRet = i - 1;
        checkForComodification();
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}

上面的代碼比較簡單,應該都可以看得懂,這里的實現很容易理解,就是iterator方法中new了一個Iterator的實現類并反回了。Itr是一個內部類,他實現了Iterator接口并實現了其中的方法。

至此,看完了JAVA中ArrayList對迭代器模式的實現。通過迭代器,可以不必關心其內部實現方式。

當我們在使用JAVA開發的時候,想使用迭代器模式的話,只要讓我們自己定義的容器類實現java.util.Iterable并實現其中的iterator方法使其返回一個java.util.Iterator的實現類就可以了。

(全文完) 歡迎關注『Java之道』微信公眾號
贊(1)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。HollisChuang's Blog » 設計模式(十四)——JDK中的迭代器模式
分享到: 更多 (0)

評論 搶沙發

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

HollisChuang's Blog

聯系我關于我
大乐透复式返奖 久联发展股票行情 幸运飞艇稳赢图片 黑龙江快乐十分钟走势 东方6十1专家推号 二门出灵码是什么数字 长沙麻将机 北京pk拾技巧教学 管家婆三肖必中特 新松机器人股票代码 25选5中奖号码