一、Iterator迭代器接口
1. 使用Iterator接口遍歷集合元素
Iterator
對象稱為迭代器(設計模式的一種),主要用于遍歷 Collection
集合中的元素。
GOF
給迭代器模式的定義為:提供一種方法訪問一個容器(container
)對象中各個元素,而又不需暴露該對象的內部細節。迭代器模式,就是為容器而生。類似于“公交車上的售票員”、“火車上的乘務員”、“空姐”。
Collection
接口繼承了java.lang.Iterable
接口,該接口有一個iterator()
方法,那么所有實現了Collection
接口的集合類都有一個iterator()
方法,用以返回一個實現了 Iterator
接口的對象。
Iterator
僅用于遍歷集合,Iterator
本身并不提供承裝對象的能力。如果需要創建 Iterator
對象,則必須有一個被迭代的集合。
集合對象每次調用iterator()
方法都得到一個全新的迭代器對象,默認游標都在集合 的第一個元素之前。
2. Iterator接口的方法
注意:在調用it.next()
方法之前必須要調用it.hasNext()
進行檢測。若不調用,且下一條記錄無效,直接調用it.next()
會拋出NoSuchElementException
異常。
3. 迭代器的執行原理
3.1 代碼演示
//hasNext():判斷是否還有下一個元素
while(iterator.hasNext()){
//next():①指針下移 ②將下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
3.2 代碼執行過程解析
當執行Iterator iterator = coll.iterator();
語句時,iterator
的指針此時執行下圖的①所標的位置,然后執行iterator.hasNext()
語句,此時會去判斷iterator
的指針指向的位置的下一個位置(即②)有無元素,若有,則返回true
,否則返回false
。當返回結果為true
時,則往下執行 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
方法。
如果還未調用next()
或在上一次調用 next()
方法之后已經調用了 remove
方法,再調用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());
// }
//錯誤方式二:
//集合對象每次調用iterator()方法都得到一個全新的迭代器對象,默認游標都在集合的第一個元素之前。
while (coll.iterator().hasNext()){
System.out.println(coll.iterator().next());
}
}
//測試Iterator中的remove()
//如果還未調用next()或在上一次調用 next 方法之后已經調用了 remove 方法,
// 再調用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 循環
1. 概述
Java 5.0
提供了 foreach
循環迭代訪問 Collection
和數組。
遍歷操作不需獲取Collection
或數組的長度,無需使用索引訪問元素。
遍歷集合的底層調用Iterator
完成操作。
foreach
還可以用來遍歷數組。
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(集合元素的類型 局部變量 : 集合對象)
//內部仍然調用了迭代器。
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(數組元素的類型 局部變量 : 數組對象)
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
}
}
到此這篇關于Java深入分析Iterator迭代器與foreach循環的使用的文章就介紹到這了,更多相關Java Iterator迭代器內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!