java迭代器
文章目錄
Iterator 迭代器接口
Iterator 對象稱爲迭代器 設計模式的一種 )),主要用於遍歷 Collection 集合中的元素。迭代器提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。迭代器模式,就是爲容器而生。
Iterator僅用於遍歷集合,lterator本身並不提供承裝對象的能力。如果需要創建lterator對象,則必須有一個被迭代的集合。
可以看下api上的介紹
解釋:集合上的迭代器,迭代器在Java集合框架中代替了枚舉。迭代器與枚舉有兩個不同之處:
1.迭代器允許調用者在迭代期間使用定義良好的語義從基礎集合中刪除元素。
2.改進了方法名。
迭代器的方法:
api上有四種方法
next():返回迭代中的下一個元素。
例子:
package com.Iterator;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
public class Iterator1 {
@Test
public void test1(){
ArrayList arrayList = new ArrayList(10);
arrayList.add("AA");
arrayList.add("BB");
arrayList.add("CC");
arrayList.add("DD");
arrayList.add("EE");
arrayList.add("FF");
Iterator integer = arrayList.iterator();
System.out.println(integer.next());
System.out.println(integer.next());
System.out.println(integer.next());
System.out.println(integer.next());
}
}
輸出:
但是如果,next()的使用次數大於數組中的元素會拋出NoSuchElementException
異常。
其實,next()有兩個作用:①指針下移 ②將下移以後集合位置上的元素返回。
hasNext():如果迭代具有更多元素,則返回true。
例子:
package com.Iterator;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
public class Iterator1 {
@Test
public void test1(){
ArrayList arrayList = new ArrayList(10);
arrayList.add("AA");
Iterator integer = arrayList.iterator();
System.out.println(integer.hasNext());
}
}
輸出:
hasNext()的主要作用是判斷是否還有下一個元素,通常和next()一起用來遍歷集合中的元素。
remove():從基礎集合中移除迭代器返回的最後一個元素。
例子:這裏先往Arraylist中添加三個元素,然後arrayList.next()使指針下移,在arrayList.remove()就是刪去指針指向的這個元素, 然後,我又創建了一個新的迭代器輸出。
package com.Iterator;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
public class Iterator1 {
@Test
public void test1(){
ArrayList arrayList = new ArrayList(10);
arrayList.add("AA");
arrayList.add("BB");
arrayList.add("CC");
Iterator integer = arrayList.iterator();
integer.next();
integer.remove();
Iterator integer2 = arrayList.iterator();
while (integer2.hasNext()){
System.out.println(integer2.next());
}
}
}
結果,可以發現AA被刪掉了
注意:
- Iterator可以刪除集合的元素,但是是遍歷過程中通過迭代器對象的remove方法,不是集合對象的remove方法。
- 如果還未調用next()或在上一次調用next 方法之後已經調用了remove方法,再調用remove都會報llegalStateException。
- 集合對象每次調用iterator()方法都得到一個全新的迭代器對象,默認遊標都在集合的第一個元素之前。
使用foreach 循環遍歷集合元素
Java 5.0提供了foreach循環迭代訪問Collection和數組。
- 遍歷操作不需獲取Collection或數組的長度,無需使用索引訪問元素。
package com.Iterator;
import org.junit.Test;
import java.util.ArrayList;
public class Iterator1 {
@Test
public void test1(){
ArrayList arrayList = new ArrayList(10);
arrayList.add("AA");
arrayList.add("BB");
arrayList.add("CC");
arrayList.add(123);
arrayList.add(456);
arrayList.add(new String("aaa"));
// foreach的使用方法
for (Object obj:arrayList) {
System.out.println(obj);
}
}
}
結果:
- 遍歷集合的底層調用lterator完成操作。
對於上面的代碼,debug調試一下,發現它會執行到Iterator接口中執行,所以可以斷定,它底層還是調用Iterator代碼。
- foreach還可以用來遍歷數組。
例如(這裏我在測試單元中測試):
@Test
public void test2(){
String[] strings = new String[]{"AA","BB","CC","DD","EE"};
for(String str : strings){
System.out.println(str);
}
}
結果: