亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析Java迭代器Iterator和Iterable的區(qū)別

 更新時(shí)間:2023年07月06日 10:35:45   作者:Cosolar  
Java語(yǔ)言中,Iterator和Iterable都是用來(lái)遍歷集合類數(shù)據(jù)結(jié)構(gòu)的接口,雖然它們有很多相似的地方,但在具體實(shí)現(xiàn)中卻有著一些不同之處,本文將詳細(xì)分析它們的區(qū)別,并提供相應(yīng)的代碼示例,需要的朋友可以參考下

1. Iterator接口

Iterator的作用是遍歷集合中的元素,它為集合提供了一種訪問(wèn)元素的方法,可以按順序訪問(wèn)集合中的每一個(gè)元素。Iterator可以處理任何實(shí)現(xiàn)了Iterable接口的集合,如List、Set、Map等。Iterator可以在遍歷集合時(shí)動(dòng)態(tài)地修改集合的內(nèi)容,如添加、刪除元素等。

Iterator接口是Java編程語(yǔ)言中一個(gè)非常重要的接口,它定義了遍歷一個(gè)集合中所有元素的方法。以下是Iterator接口的主要方法:

public interface Iterator<E> { 
    boolean hasNext() // 如果還有元素可以迭代,則返回true
    E next() // 返回迭代的下一個(gè)元素
    void remove() // 從迭代器指向的集合中刪除最后一個(gè)元素
}

Iterator 接口,JDK 1.2 的時(shí)候就有了,用來(lái)改進(jìn) Enumeration 接口:

  • 允許刪除元素(增加了 remove 方法)
  • 優(yōu)化了方法名(Enumeration 中是 hasMoreElements 和 nextElement,不簡(jiǎn)潔)

Iterator接口是一個(gè)單向遍歷接口,只能向前遍歷集合中的元素,而無(wú)法回溯或反向遍歷。此外,只讀集合無(wú)法使用Iterator進(jìn)行修改操作。

以下是使用Iterator接口遍歷ArrayList集合的示例代碼:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String fruit = iterator.next();
    System.out.println(fruit);
}

輸出結(jié)果:

apple
banana
orange

2. Iterable接口

Iterable的作用是提供一種遍歷集合的方式,它是一個(gè)接口,用于表示實(shí)現(xiàn)了該接口的對(duì)象都可以被迭代。Iterable接口為集合提供了一種統(tǒng)一的遍歷方式,從而可以在不同的集合間實(shí)現(xiàn)通用的迭代操作。

Iterable接口是Java編程語(yǔ)言中另一個(gè)非常重要的接口,它定義了一個(gè)可以被迭代的對(duì)象,并提供了一個(gè)默認(rèn)的iterator()方法,優(yōu)化了遍歷操作的可讀性。以下是Iterable接口的主要方法:

Iterator<T> iterator() // 返回一個(gè)Iterator對(duì)象用于迭代集合

JDK 1.8 時(shí),Iterable 接口中新增了 forEach 方法。該方法接受一個(gè) Consumer 對(duì)象作為參數(shù),用于對(duì)集合中的每個(gè)元素執(zhí)行指定的操作。該方法的實(shí)現(xiàn)方式是使用 for-each 循環(huán)遍歷集合中的元素,對(duì)于每個(gè)元素,調(diào)用 Consumer 對(duì)象的 accept 方法執(zhí)行指定的操作。

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

該方法實(shí)現(xiàn)時(shí)首先會(huì)對(duì) action 參數(shù)進(jìn)行非空檢查,如果為 null 則拋出 NullPointerException 異常。然后使用 for-each 循環(huán)遍歷集合中的元素,并對(duì)每個(gè)元素調(diào)用 action.accept(t) 方法執(zhí)行指定的操作。由于 Iterable 接口是 Java 集合框架中所有集合類型的基本接口,因此該方法可以被所有實(shí)現(xiàn)了 Iterable 接口的集合類型使用。它對(duì) Iterable 的每個(gè)元素執(zhí)行給定操作,具體指定的操作需要自己寫(xiě)Consumer接口通過(guò)accept方法回調(diào)出來(lái)。

使用Iterable接口時(shí),我們可以直接使用for-each循環(huán)來(lái)遍歷集合,來(lái)簡(jiǎn)化代碼。例如:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
for(String fruit : list){
    System.out.println(fruit);
}
/* 寫(xiě)得更淺顯易懂點(diǎn),就是:
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
});*/

輸出結(jié)果:

apple
banana
orange

與Iterator接口不同,Iterable接口是雙向迭代器,可以進(jìn)行正向和反向遍歷。但I(xiàn)terable接口僅用于遍歷讀取操作,無(wú)法進(jìn)行修改操作。

3. 區(qū)別分析

在上述兩個(gè)接口中,最重要的區(qū)別是它們對(duì)代碼的便捷性有所不同。Iterator是一個(gè)單獨(dú)的迭代器接口,需要手動(dòng)調(diào)用next()、hasNext()和remove()等方法來(lái)遍歷集合中的元素,需要寫(xiě)很多重復(fù)的代碼。而Iterable接口則采用了for-each循環(huán)語(yǔ)法來(lái)簡(jiǎn)化代碼,使得開(kāi)發(fā)者更加輕松地遍歷集合。

此外,在使用時(shí),Iterator接口只能遍歷一次集合,而Iterable接口可以多次遍歷集合。由于Iterator接口是通過(guò)遍歷每個(gè)元素來(lái)訪問(wèn)集合內(nèi)部元素的,因此無(wú)法反復(fù)遍歷。相比之下,Iterable接口中的iterator()方法返回的是一個(gè)新的迭代器對(duì)象,因此可以反復(fù)地使用for-each語(yǔ)句來(lái)遍歷集合,從而更加靈活方便。

最后,在對(duì)只讀集合進(jìn)行操作時(shí),Iterable接口提供的for-each循環(huán)語(yǔ)法更為便捷。在這種情況下,Iterator接口需要通過(guò)while循環(huán)遍歷集合,并且無(wú)法在同一代碼塊中操作集合。因此,Iterable接口具有更好的可讀性和可維護(hù)性。

下面是一個(gè)用Iterable接口遍歷LinkedList集合的示例代碼:

List<String> list = new LinkedList<>();
list.add("apple");
list.add("banana");
list.add("orange");
// 使用Iterator遍歷列表 
Iterator<String> iterator = list.iterator(); 
while (iterator.hasNext()) { 
    String item = iterator.next(); 
    System.out.println(item);
}
// 使用Iterable遍歷列表 
Iterable<String> iterable = list;
for (String item : iterable) { 
    System.out.println(item); 
}

輸出結(jié)果:

apple
banana
orange

apple
banana
orange

從上面的代碼可以看出,Iterator和Iterable都可以用于遍歷列表,并且輸出的結(jié)果是相同的。但是,Iterator可以在迭代過(guò)程中動(dòng)態(tài)地修改集合的內(nèi)容,而Iterable則不能。此外,Iterator可以在遍歷時(shí)刪除元素,而Iterable不支持刪除操作。

4. 總結(jié)

Iterator和Iterable是Java編程語(yǔ)言中兩個(gè)非常重要的接口,都是用于遍歷集合類數(shù)據(jù)結(jié)構(gòu)的。它們雖然有著很多相似的地方,但在實(shí)現(xiàn)細(xì)節(jié)和代碼便捷性方面有所不同。

在實(shí)際應(yīng)用中,我們需要根據(jù)具體的業(yè)務(wù)場(chǎng)景來(lái)選擇使用哪個(gè)接口。如果需要進(jìn)行單向遍歷、修改等操作,可以選擇使用Iterator接口;如果需要進(jìn)行雙向遍歷、只讀操作等操作,則可以選擇使用Iterable接口。

無(wú)論哪個(gè)接口,都可以通過(guò)Java提供的語(yǔ)法糖來(lái)簡(jiǎn)化代碼,使得集合遍歷更加便捷、可讀、易維護(hù)。

以上就是淺析Java迭代器Iterator和Iterable的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Java Iterator和Iterable區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決

    RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決

    這篇文章主要介紹了RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot?分模塊開(kāi)發(fā)的操作方法

    SpringBoot?分模塊開(kāi)發(fā)的操作方法

    這篇文章主要介紹了SpringBoot?分模塊開(kāi)發(fā)的操作方法,通過(guò)在原項(xiàng)目新增一個(gè)maven模塊,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • String split方法實(shí)現(xiàn)過(guò)程圖解

    String split方法實(shí)現(xiàn)過(guò)程圖解

    這篇文章主要介紹了String split方法實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Netty中ChannelPoolHandler調(diào)用處理程序詳解

    Netty中ChannelPoolHandler調(diào)用處理程序詳解

    這篇文章主要介紹了Netty中ChannelPoolHandler調(diào)用處理程序詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來(lái)簡(jiǎn)化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下
    2023-11-11
  • Java8?函數(shù)式編程stream流使用詳解

    Java8?函數(shù)式編程stream流使用詳解

    這篇文章主要介紹了Java8?函數(shù)式編程stream流使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • SpringBoot父子線程數(shù)據(jù)傳遞的五種方案介紹

    SpringBoot父子線程數(shù)據(jù)傳遞的五種方案介紹

    在實(shí)際開(kāi)發(fā)過(guò)程中我們需要父子之間傳遞一些數(shù)據(jù),比如用戶信息等。該文章從5種解決方案解決父子之間數(shù)據(jù)傳遞困擾,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)

    springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerCont

    這篇文章主要介紹了springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available),通過(guò)分析錯(cuò)誤信息、排查代碼和配置,找出問(wèn)題的根源,并給出相應(yīng)的解決方案,感興趣的可以了解一下
    2024-01-01
  • 淺談Spring嵌套事務(wù)是怎么回滾的

    淺談Spring嵌套事務(wù)是怎么回滾的

    本文主要介紹了Spring嵌套事務(wù)是怎么回滾的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳解

    Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳

    本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();
    2022-02-02
  • Mybatis-plus在項(xiàng)目中的簡(jiǎn)單應(yīng)用

    Mybatis-plus在項(xiàng)目中的簡(jiǎn)單應(yīng)用

    Mybatis-plus是Spring框架中OOM的一大利器,其簡(jiǎn)單易用參考官網(wǎng)文檔即可很快上手,本文主要介紹了邏輯刪除,自動(dòng)填充,分頁(yè)插件等的簡(jiǎn)單使用,感興趣的可以了解一下
    2021-07-07

最新評(píng)論