Java深入分析Iterator迭代器與foreach循環(huán)的使用
一、Iterator迭代器接口
1. 使用Iterator接口遍歷集合元素
Iterator
對象稱為迭代器(設(shè)計模式的一種),主要用于遍歷 Collection
集合中的元素。
GOF
給迭代器模式的定義為:提供一種方法訪問一個容器(container
)對象中各個元素,而又不需暴露該對象的內(nèi)部細(xì)節(jié)。迭代器模式,就是為容器而生。類似于“公交車上的售票員”、“火車上的乘務(wù)員”、“空姐”。
Collection
接口繼承了java.lang.Iterable
接口,該接口有一個iterator()
方法,那么所有實現(xiàn)了Collection
接口的集合類都有一個iterator()
方法,用以返回一個實現(xiàn)了 Iterator
接口的對象。
Iterator
僅用于遍歷集合,Iterator
本身并不提供承裝對象的能力。如果需要創(chuàng)建 Iterator
對象,則必須有一個被迭代的集合。
集合對象每次調(diào)用iterator()
方法都得到一個全新的迭代器對象,默認(rèn)游標(biāo)都在集合 的第一個元素之前。
2. Iterator接口的方法
注意:在調(diào)用it.next()
方法之前必須要調(diào)用it.hasNext()
進(jìn)行檢測。若不調(diào)用,且下一條記錄無效,直接調(diào)用it.next()
會拋出NoSuchElementException
異常。
3. 迭代器的執(zhí)行原理
3.1 代碼演示
//hasNext():判斷是否還有下一個元素 while(iterator.hasNext()){ //next():①指針下移 ②將下移以后集合位置上的元素返回 System.out.println(iterator.next()); }
3.2 代碼執(zhí)行過程解析
當(dāng)執(zhí)行Iterator iterator = coll.iterator();
語句時,iterator
的指針此時執(zhí)行下圖的①所標(biāo)的位置,然后執(zhí)行iterator.hasNext()
語句,此時會去判斷iterator
的指針指向的位置的下一個位置(即②)有無元素,若有,則返回true
,否則返回false
。當(dāng)返回結(jié)果為true
時,則往下執(zhí)行 iterator.next()
語句,此時iterator
的指針下移并且把下移后的指針指向的集合位置上的元素返回。
4. Iterator接口remove()方法
4.1 代碼演示
Iterator iter = coll.iterator();//回到起點 while(iter.hasNext()){ Object obj = iter.next(); if(obj.equals("Tom")){ iter.remove(); } }
4.2 注意
Iterator
可以刪除集合的元素,但是是遍歷過程中通過迭代器對象的remove
方法,不是集合對象的remove
方法。
如果還未調(diào)用next()
或在上一次調(diào)用 next()
方法之后已經(jīng)調(diào)用了 remove
方法,再調(diào)用remove
都會報IllegalStateException
異常。
5. 代碼演示
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); Iterator iterator = coll.iterator(); //方式一: // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // System.out.println(iterator.next()); // //報異常:NoSuchElementException // System.out.println(iterator.next()); //方式二:不推薦 // for(int i = 0;i < coll.size();i++){ // System.out.println(iterator.next()); // } //方式三:推薦 hasNext():判斷是否還有下一個元素 while(iterator.hasNext()){ //next():①指針下移 ②將下移以后集合位置上的元素返回 System.out.println(iterator.next()); } }
@Test public void test2(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //錯誤方式一: // Iterator iterator = coll.iterator(); // while((iterator.next()) != null){ // System.out.println(iterator.next()); // } //錯誤方式二: //集合對象每次調(diào)用iterator()方法都得到一個全新的迭代器對象,默認(rèn)游標(biāo)都在集合的第一個元素之前。 while (coll.iterator().hasNext()){ System.out.println(coll.iterator().next()); } } //測試Iterator中的remove() //如果還未調(diào)用next()或在上一次調(diào)用 next 方法之后已經(jīng)調(diào)用了 remove 方法, // 再調(diào)用remove都會報IllegalStateException。
@Test public void test3(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //刪除集合中"Tom" Iterator iterator = coll.iterator(); while (iterator.hasNext()){ // iterator.remove(); Object obj = iterator.next(); if("Tom".equals(obj)){ iterator.remove(); // iterator.remove(); } } //遍歷集合 iterator = coll.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } }
二、foreach 循環(huán)
1. 概述
Java 5.0
提供了 foreach
循環(huán)迭代訪問 Collection
和數(shù)組。
遍歷操作不需獲取Collection
或數(shù)組的長度,無需使用索引訪問元素。
遍歷集合的底層調(diào)用Iterator
完成操作。
foreach
還可以用來遍歷數(shù)組。
2. 語法解析
3. 代碼演示
@Test public void test1(){ Collection coll = new ArrayList(); coll.add(123); coll.add(456); coll.add(new Person("Jerry",20)); coll.add(new String("Tom")); coll.add(false); //for(集合元素的類型 局部變量 : 集合對象) //內(nèi)部仍然調(diào)用了迭代器。 for(Object obj : coll){ System.out.println(obj); } //123 //456 //Person@621be5d1 //Tom //false }
@Test public void test2(){ int[] arr = new int[]{1,2,3,4,5,6}; //for(數(shù)組元素的類型 局部變量 : 數(shù)組對象) for(int i : arr){ System.out.println(i); } //1 //2 //3 //4 //5 //6 }
4. 易錯題
public class test { public static void main(String[] args) { String[] str = new String[5]; for (String myStr : str) { myStr = "小老師ir"; System.out.println(myStr); } //小老師ir //小老師ir //小老師ir //小老師ir //小老師ir for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } //null //null //null //null //null } }
到此這篇關(guān)于Java深入分析Iterator迭代器與foreach循環(huán)的使用的文章就介紹到這了,更多相關(guān)Java Iterator迭代器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud Config配置中心使用與相關(guān)介紹
springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-09-09Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法
二叉搜索樹是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹,且每個節(jié)點的值都大于其左子樹中任何節(jié)點的值,而小于其右子樹中任何節(jié)點的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實現(xiàn)二叉搜索樹的核心方法,需要的朋友可以參考下2023-12-12Java并發(fā)編程volatile關(guān)鍵字的作用
這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07Java StringUtils字符串分割轉(zhuǎn)數(shù)組的實現(xiàn)
這篇文章主要介紹了Java StringUtils字符串分割轉(zhuǎn)數(shù)組的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)
這篇文章主要介紹了關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03