Java深入分析Iterator迭代器與foreach循環(huán)的使用
一、Iterator迭代器接口
1. 使用Iterator接口遍歷集合元素
Iterator對(duì)象稱為迭代器(設(shè)計(jì)模式的一種),主要用于遍歷 Collection 集合中的元素。
GOF給迭代器模式的定義為:提供一種方法訪問(wèn)一個(gè)容器(container)對(duì)象中各個(gè)元素,而又不需暴露該對(duì)象的內(nèi)部細(xì)節(jié)。迭代器模式,就是為容器而生。類似于“公交車上的售票員”、“火車上的乘務(wù)員”、“空姐”。
Collection接口繼承了java.lang.Iterable接口,該接口有一個(gè)iterator()方法,那么所有實(shí)現(xiàn)了Collection接口的集合類都有一個(gè)iterator()方法,用以返回一個(gè)實(shí)現(xiàn)了 Iterator接口的對(duì)象。
Iterator 僅用于遍歷集合,Iterator 本身并不提供承裝對(duì)象的能力。如果需要?jiǎng)?chuàng)建 Iterator對(duì)象,則必須有一個(gè)被迭代的集合。
集合對(duì)象每次調(diào)用iterator()方法都得到一個(gè)全新的迭代器對(duì)象,默認(rèn)游標(biāo)都在集合 的第一個(gè)元素之前。
2. Iterator接口的方法

注意:在調(diào)用it.next()方法之前必須要調(diào)用it.hasNext()進(jìn)行檢測(cè)。若不調(diào)用,且下一條記錄無(wú)效,直接調(diào)用it.next()會(huì)拋出NoSuchElementException異常。
3. 迭代器的執(zhí)行原理
3.1 代碼演示
//hasNext():判斷是否還有下一個(gè)元素
while(iterator.hasNext()){
//next():①指針下移 ②將下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
3.2 代碼執(zhí)行過(guò)程解析
當(dāng)執(zhí)行Iterator iterator = coll.iterator();語(yǔ)句時(shí),iterator的指針此時(shí)執(zhí)行下圖的①所標(biāo)的位置,然后執(zhí)行iterator.hasNext()語(yǔ)句,此時(shí)會(huì)去判斷iterator的指針指向的位置的下一個(gè)位置(即②)有無(wú)元素,若有,則返回true,否則返回false。當(dāng)返回結(jié)果為true時(shí),則往下執(zhí)行 iterator.next()語(yǔ)句,此時(shí)iterator的指針下移并且把下移后的指針指向的集合位置上的元素返回。

4. Iterator接口remove()方法
4.1 代碼演示
Iterator iter = coll.iterator();//回到起點(diǎn)
while(iter.hasNext()){
Object obj = iter.next();
if(obj.equals("Tom")){
iter.remove();
} }
4.2 注意
Iterator可以刪除集合的元素,但是是遍歷過(guò)程中通過(guò)迭代器對(duì)象的remove方法,不是集合對(duì)象的remove方法。
如果還未調(diào)用next()或在上一次調(diào)用 next() 方法之后已經(jīng)調(diào)用了 remove 方法,再調(diào)用remove都會(huì)報(bào)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());
// //報(bào)異常:NoSuchElementException
// System.out.println(iterator.next());
//方式二:不推薦
// for(int i = 0;i < coll.size();i++){
// System.out.println(iterator.next());
// }
//方式三:推薦
hasNext():判斷是否還有下一個(gè)元素
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);
//錯(cuò)誤方式一:
// Iterator iterator = coll.iterator();
// while((iterator.next()) != null){
// System.out.println(iterator.next());
// }
//錯(cuò)誤方式二:
//集合對(duì)象每次調(diào)用iterator()方法都得到一個(gè)全新的迭代器對(duì)象,默認(rèn)游標(biāo)都在集合的第一個(gè)元素之前。
while (coll.iterator().hasNext()){
System.out.println(coll.iterator().next());
}
}
//測(cè)試Iterator中的remove()
//如果還未調(diào)用next()或在上一次調(diào)用 next 方法之后已經(jīng)調(diào)用了 remove 方法,
// 再調(diào)用remove都會(huì)報(bào)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)迭代訪問(wèn) Collection和數(shù)組。
遍歷操作不需獲取Collection或數(shù)組的長(zhǎng)度,無(wú)需使用索引訪問(wèn)元素。
遍歷集合的底層調(diào)用Iterator完成操作。
foreach還可以用來(lái)遍歷數(shù)組。
2. 語(yǔ)法解析

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(集合元素的類型 局部變量 : 集合對(duì)象)
//內(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ù)組對(duì)象)
for(int i : arr){
System.out.println(i);
}
//1
//2
//3
//4
//5
//6
}
4. 易錯(cuò)題
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud Config配置中心使用與相關(guān)介紹
springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-09-09
Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹(shù)的核心方法
二叉搜索樹(shù)是一種常用的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹(shù),且每個(gè)節(jié)點(diǎn)的值都大于其左子樹(shù)中任何節(jié)點(diǎn)的值,而小于其右子樹(shù)中任何節(jié)點(diǎn)的值,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)篇之實(shí)現(xiàn)二叉搜索樹(shù)的核心方法,需要的朋友可以參考下2023-12-12
幾種常見(jiàn)mybatis分頁(yè)實(shí)現(xiàn)方式
這篇文章主要介紹了幾種常見(jiàn)mybatis分頁(yè)實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java并發(fā)編程volatile關(guān)鍵字的作用
這篇文章主要介紹了Java并發(fā)編程volatile關(guān)鍵字的作用,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Spring 與 JDK 線程池的簡(jiǎn)單使用示例詳解
這篇文章主要介紹了Spring 與 JDK 線程池的簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Java實(shí)現(xiàn)微信公眾號(hào)獲取臨時(shí)二維碼功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)微信公眾號(hào)獲取臨時(shí)二維碼功能,結(jié)合實(shí)例形式分析了java調(diào)用微信公眾號(hào)接口實(shí)現(xiàn)臨時(shí)二維碼生成功能相關(guān)操作技巧,需要的朋友可以參考下2019-10-10
Java StringUtils字符串分割轉(zhuǎn)數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了Java StringUtils字符串分割轉(zhuǎn)數(shù)組的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)
這篇文章主要介紹了關(guān)于Jedis的用法以及Jedis使用Redis事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

