當前位置:成語大全網 - 書法字典 - java是怎樣的遍歷。next()方法?

java是怎樣的遍歷。next()方法?

是叠代器遍歷,

叠代器模式

壹.導言

熟悉Java的人肯定不會對叠代這個術語感到陌生。我們經常使用JDK提供的叠代接口來遍歷java集合:

叠代器it = list . iterator();

while(it.hasNext()){

//使用" it . next();"做壹些商業邏輯

}

這是叠代器模式應用的壹個很好的例子。

二、定義和結構

叠代器模式,也稱為遊標模式。GOF將其定義為提供壹種訪問容器對象中的元素而不暴露對象內部細節的方法。

從定義中可以看出,叠代器模式是為容器而生的。顯然,對容器對象的訪問必須涉及遍歷算法。您可以將遍歷方法壹次塞進容器對象中;或者根本不提供任何遍歷算法,讓使用容器的人自己去實現。這兩種情況似乎都能解決問題。

但是,在前壹種情況下,容器承載了太多的功能。它不僅負責維護自己“容器”中的元素(添加、刪除等)。),而且還提供了壹個接口來遍歷自身。而且由於保存遍歷狀態的問題,無法同時多次遍歷同壹個容器對象。第二種方法很方便,但是它暴露了容器的內部細節。

叠代器模式的出現很好的解決了以上兩種情況的弊端。我們先來看看叠代器模式的真實面目。

叠代器模式由以下角色組成:

1)叠代器:叠代器角色負責定義訪問和遍歷元素的接口。

2)具體叠代器:具體叠代器要實現叠代器接口,記錄遍歷中的當前位置。

3)容器:容器角色負責提供創建特定叠代器角色的接口。

4)具體容器:具體容器角色實現了創建具體叠代器角色的接口——這個具體叠代器角色與容器的結構有關。

叠代器模式的類圖如下:

從結構中可以看出,叠代器模式在客戶端和容器之間增加了叠代器角色。叠代器角色的加入,可以很好的避免容器內部細節的暴露,也可以做出“單壹責任原則”的設計符號。

註意,在叠代器模式中,特定的叠代器角色和特定的容器角色是耦合在壹起的——遍歷算法與容器的內部細節密切相關。為了使客戶端程序擺脫與特定叠代器角色耦合的困境,避免特定叠代器角色替換帶來的修改,叠代器模式對特定叠代器角色進行了抽象,使客戶端程序更具通用性和可重用性。這被稱為多態叠代。

第三,比如

因為叠代器模式本身是松散定義的,所以具體實現是多種多樣的。這裏只舉壹個例子,不能壹壹呈現實現方法。所以在舉例之前,我們先列出叠代器模式的實現。

1.叠代器角色定義遍歷接口,但不指定誰控制叠代。在Java集合的應用中,遍歷過程由客戶端程序控制,稱為外部叠代器。實現這壹點的另壹種方法是通過叠代器本身來控制叠代,這被稱為內部叠代器。外部叠代器比內部叠代器更加靈活和強大,而內部叠代器在java語言環境下可用性較弱。

2.在叠代器模式中,沒有指定誰來實現遍歷算法。在叠代器角色中實現它似乎很自然。因為在壹個容器上使用不同的遍歷算法很方便,所以對不同的容器應用壹種遍歷算法也很方便。但這破壞了容器的封裝——容器角色必須公開其私有屬性,這意味著向java中的其他類公開其私有屬性。

那我們就放入容器角色來實現吧。這樣,叠代器角色的開銷是只存儲壹個遍歷當前位置的函數。但是遍歷算法與特定的容器緊密相關。

在Java集合的應用中,提供的具體叠代器角色是容器角色中定義的內部類。這保護了容器的包裝。但同時容器也提供了遍歷算法接口,妳可以擴展自己的叠代器。

好了,我們來看看Java集合中的叠代器是如何實現的。

//叠代器角色,只定義了遍歷接口。

公共接口叠代器{

布爾型has next();

object next();

void remove();

}

//容器角色,這裏以List為例。它只是壹個接口,我就不列舉了。

//具體的容器角色是ArrayList和其他實現List接口的類。為了突出重點,這裏指的是列出與叠代器相關的內容

//具體的叠代器角色,是內部類的形式。AbstractList的存在是為了提取每個特定容器角色的公共部分。

公共抽象類AbstractList擴展AbstractCollection實現List {

……

//這是負責創建特定叠代器角色的工廠方法。

公共叠代器iterator() {

返回新的Itr();

}

//作為內部類的具體叠代器角色

私有類Itr實現叠代器{

int cursor = 0;

int lastRet =-1;

int expectedModCount = modCount

public boolean hasNext() {

返回光標!= size();

}

公共對象next() {

checkforcomedification();

嘗試{

Object next = get(光標);

lastRet = cursor++;

下壹個返回;

} catch(IndexOutOfBoundsException e){

checkforcomedification();

拋出新的NoSuchElementException();

}

}

公共void remove() {

if (lastRet == -1)

拋出新的IllegalStateException();

checkforcomedification();

嘗試{

abstract list . this . remove(lastRet);

if(lastRet & lt;光標)

光標-;

lastRet =-1;

expectedModCount = modCount

} catch(IndexOutOfBoundsException e){

拋出new ConcurrentModificationException();

}

}

針對修改()的最終無效檢查{

如果(modCount!= expectedModCount)

拋出new ConcurrentModificationException();

}

}

至於叠代器模式的使用。如簡介中所列,客戶端程序應該先獲取具體的容器角色,然後通過具體的容器角色獲取具體的叠代器角色。所以您可以使用具體的叠代器角色來遍歷容器...

第四,實現自己的叠代器

當實現妳自己的叠代器時,通常需要被操作的容器有壹個支持的接口。而且我們還應該註意以下幾個問題:

在叠代器遍歷的過程中,通過這個叠代器加減容器元素是否安全?

當容器中有復合對象時,叠代器如何支持深度遍歷和多重遍歷?

以上兩個問題對於不同結構的容器的作用是不同的,值得考慮。

動詞 (verb的縮寫)應用

從上面我們可以看到叠代器模式給容器的應用帶來了以下好處:

1)支持以不同的方式遍歷容器角色。根據實施方法的不同,效果會有所不同。

2)簡化了容器的接口。但是,為了提高java集合中的可伸縮性,容器仍然提供了壹個遍歷接口。

3)可以同時遍歷同壹個容器對象。因為遍歷狀態存儲在每個叠代器對象中。

由此,我們也可以得到叠代器模式的適用範圍:

1)訪問容器對象的內容,而不公開其內部表示。

2)支持容器對象的多次遍歷。

3)為遍歷不同的容器結構提供統壹的接口(多態叠代)。