淺析Java迭代器Iterator和Iterable的區(qū)別
1. Iterator接口
Iterator的作用是遍歷集合中的元素,它為集合提供了一種訪問元素的方法,可以按順序訪問集合中的每一個元素。Iterator可以處理任何實現(xiàn)了Iterable接口的集合,如List、Set、Map等。Iterator可以在遍歷集合時動態(tài)地修改集合的內(nèi)容,如添加、刪除元素等。
Iterator接口是Java編程語言中一個非常重要的接口,它定義了遍歷一個集合中所有元素的方法。以下是Iterator接口的主要方法:
public interface Iterator<E> { boolean hasNext() // 如果還有元素可以迭代,則返回true E next() // 返回迭代的下一個元素 void remove() // 從迭代器指向的集合中刪除最后一個元素 }
Iterator 接口,JDK 1.2 的時候就有了,用來改進 Enumeration 接口:
- 允許刪除元素(增加了 remove 方法)
- 優(yōu)化了方法名(Enumeration 中是 hasMoreElements 和 nextElement,不簡潔)
Iterator接口是一個單向遍歷接口,只能向前遍歷集合中的元素,而無法回溯或反向遍歷。此外,只讀集合無法使用Iterator進行修改操作。
以下是使用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的作用是提供一種遍歷集合的方式,它是一個接口,用于表示實現(xiàn)了該接口的對象都可以被迭代。Iterable接口為集合提供了一種統(tǒng)一的遍歷方式,從而可以在不同的集合間實現(xiàn)通用的迭代操作。
Iterable接口是Java編程語言中另一個非常重要的接口,它定義了一個可以被迭代的對象,并提供了一個默認的iterator()方法,優(yōu)化了遍歷操作的可讀性。以下是Iterable接口的主要方法:
Iterator<T> iterator() // 返回一個Iterator對象用于迭代集合
JDK 1.8 時,Iterable 接口中新增了 forEach 方法。該方法接受一個 Consumer 對象作為參數(shù),用于對集合中的每個元素執(zhí)行指定的操作。該方法的實現(xiàn)方式是使用 for-each 循環(huán)遍歷集合中的元素,對于每個元素,調(diào)用 Consumer 對象的 accept 方法執(zhí)行指定的操作。
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
該方法實現(xiàn)時首先會對 action 參數(shù)進行非空檢查,如果為 null 則拋出 NullPointerException 異常。然后使用 for-each 循環(huán)遍歷集合中的元素,并對每個元素調(diào)用 action.accept(t) 方法執(zhí)行指定的操作。由于 Iterable 接口是 Java 集合框架中所有集合類型的基本接口,因此該方法可以被所有實現(xiàn)了 Iterable 接口的集合類型使用。它對 Iterable 的每個元素執(zhí)行給定操作,具體指定的操作需要自己寫Consumer接口通過accept方法回調(diào)出來。
使用Iterable接口時,我們可以直接使用for-each循環(huán)來遍歷集合,來簡化代碼。例如:
List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("orange"); for(String fruit : list){ System.out.println(fruit); } /* 寫得更淺顯易懂點,就是: list.forEach(new Consumer<String>() { @Override public void accept(String str) { System.out.println(str); } });*/
輸出結(jié)果:
apple
banana
orange
與Iterator接口不同,Iterable接口是雙向迭代器,可以進行正向和反向遍歷。但Iterable接口僅用于遍歷讀取操作,無法進行修改操作。
3. 區(qū)別分析
在上述兩個接口中,最重要的區(qū)別是它們對代碼的便捷性有所不同。Iterator是一個單獨的迭代器接口,需要手動調(diào)用next()、hasNext()和remove()等方法來遍歷集合中的元素,需要寫很多重復的代碼。而Iterable接口則采用了for-each循環(huán)語法來簡化代碼,使得開發(fā)者更加輕松地遍歷集合。
此外,在使用時,Iterator接口只能遍歷一次集合,而Iterable接口可以多次遍歷集合。由于Iterator接口是通過遍歷每個元素來訪問集合內(nèi)部元素的,因此無法反復遍歷。相比之下,Iterable接口中的iterator()方法返回的是一個新的迭代器對象,因此可以反復地使用for-each語句來遍歷集合,從而更加靈活方便。
最后,在對只讀集合進行操作時,Iterable接口提供的for-each循環(huán)語法更為便捷。在這種情況下,Iterator接口需要通過while循環(huán)遍歷集合,并且無法在同一代碼塊中操作集合。因此,Iterable接口具有更好的可讀性和可維護性。
下面是一個用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
orangeapple
banana
orange
從上面的代碼可以看出,Iterator和Iterable都可以用于遍歷列表,并且輸出的結(jié)果是相同的。但是,Iterator可以在迭代過程中動態(tài)地修改集合的內(nèi)容,而Iterable則不能。此外,Iterator可以在遍歷時刪除元素,而Iterable不支持刪除操作。
4. 總結(jié)
Iterator和Iterable是Java編程語言中兩個非常重要的接口,都是用于遍歷集合類數(shù)據(jù)結(jié)構(gòu)的。它們雖然有著很多相似的地方,但在實現(xiàn)細節(jié)和代碼便捷性方面有所不同。
在實際應(yīng)用中,我們需要根據(jù)具體的業(yè)務(wù)場景來選擇使用哪個接口。如果需要進行單向遍歷、修改等操作,可以選擇使用Iterator接口;如果需要進行雙向遍歷、只讀操作等操作,則可以選擇使用Iterable接口。
無論哪個接口,都可以通過Java提供的語法糖來簡化代碼,使得集合遍歷更加便捷、可讀、易維護。
以上就是淺析Java迭代器Iterator和Iterable的區(qū)別的詳細內(nèi)容,更多關(guān)于Java Iterator和Iterable區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java集合中的Iterator迭代器接口詳解
- Java中不得不知的Collection接口與Iterator迭代器
- Java中Iterator(迭代器)的用法詳解
- Java使用迭代器Iterator遍歷集合
- Java中Iterator迭代器的使用詳解
- Java集合框架迭代器Iterator實現(xiàn)原理解析
- Java如何使用Iterator迭代器刪除集合重復選項
- 如何實現(xiàn)java Iterator迭代器功能
- Java Iterator接口遍歷單列集合迭代器原理詳解
- Java使用Iterator迭代器遍歷集合數(shù)據(jù)的方法小結(jié)
- java集合中的迭代器Iterator和數(shù)組內(nèi)置方法及常見的報錯解決方案
相關(guān)文章
Netty中ChannelPoolHandler調(diào)用處理程序詳解
這篇文章主要介紹了Netty中ChannelPoolHandler調(diào)用處理程序詳解,Netty 是基于 Java NIO 的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API,需要的朋友可以參考下2023-11-11SpringBoot父子線程數(shù)據(jù)傳遞的五種方案介紹
在實際開發(fā)過程中我們需要父子之間傳遞一些數(shù)據(jù),比如用戶信息等。該文章從5種解決方案解決父子之間數(shù)據(jù)傳遞困擾,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-09-09springboot整合websocket后啟動報錯(javax.websocket.server.ServerCont
這篇文章主要介紹了springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available),通過分析錯誤信息、排查代碼和配置,找出問題的根源,并給出相應(yīng)的解決方案,感興趣的可以了解一下2024-01-01Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳
本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();2022-02-02