Java之集合的遍歷與迭代器
阿新 • • 發佈:2022-04-29
集合的遍歷
依次獲取集合中的每一個元素
將集合轉換成陣列,遍歷陣列
//取出所有的學號, 迭代之後顯示學號為1004-1009 Object[] c=map.keySet().toArray();//取出學號轉換為陣列 System.out.println(c); for (int i = 0; i < c.length; i++) { int n=(int)c[i];//陣列向下轉型 if(n>=1004&&n<=1009){ System.out.println(n); } }
for迴圈與迭代器
package collectionTest; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class test { public static void main(String[] args) { List list=new ArrayList(); list.add("aaa"); list.add("ccc"); list.add("vvv"); list.add("bbb"); list.add("nnn"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } //foreach迴圈遍歷,沒有下標,需要的話可以自己定義 for(Object s:list){ System.out.println(s); } Iterator iter=list.iterator(); while(iter.hasNext()){//判斷有沒有下一個 System.out.println(iter.next()); } Map map=new HashMap(); map.put("aa", 1); map.put("bb", 2); map.put("cc", 3); map.put("dd", 4); Set set=map.keySet();//返回Set集合,存放map的鍵的值 for(Object o:set){ System.out.println(o);//輸出物件的鍵 System.out.println(map.get(o));//輸出物件的值,無序 } Iterator iter2=set.iterator(); while(iter2.hasNext()){//遍歷 System.out.println(map.get(iter2.next())); } Collection c=map.values();//返回Collection Iterator iter3=c.iterator(); while(iter3.hasNext()){ System.out.println(iter3.next()); } } }
Iterator iterator():迭代器,集合的專用遍歷方式
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Test1 { public static void main(String[] args) { // 建立集合物件 Collection c = new ArrayList(); // 建立並新增元素 // String s = "hello"; // c.add(s); c.add("hello"); c.add("world"); c.add("java"); // Iterator iterator():迭代器,集合的專用遍歷方式 Iterator it = c.iterator(); // 實際返回的肯定是子類物件,這裡是多型 // Object obj = it.next();返回下一個元素,然後跳到下一個,最開始因為本身沒有所以返回的是第一個 // System.out.println(obj); // System.out.println(it.next());//返回下一個元素之後自身跳到下一個等待呼叫 // System.out.println(it.next()); // System.out.println(it.next()); // System.out.println(it.next()); // 最後一個不應該寫,所以,我們應該在每次獲取前,如果有一個判斷就好了 // 判斷是否有下一個元素,有就獲取,沒有就不搭理它 // if (it.hasNext()) { // System.out.println(it.next()); // } // if (it.hasNext()) { // System.out.println(it.next()); // } // if (it.hasNext()) { // System.out.println(it.next()); // } // if (it.hasNext()) { // System.out.println(it.next()); // } // if (it.hasNext()) { // System.out.println(it.next()); // } // 最終版程式碼 while (it.hasNext()) { // System.out.println(it.next()); String s = (String) it.next(); System.out.println(s);//如果這裡輸出的是it.next() 就會跳著輸出下一個 } } }
for 迭代
for(Iterator it = c.iterator();it.hasNext();){
String s = (String) it.next();
System.out.println(s);
}
這種方法的優勢在於,迴圈結束後 Iterator it 就被銷燬了,所以比使用while更加節約資源。
迭代器使用問題的探討:
Iterator iter=list.iterator();//iterator返回的是子類物件,這裡是多型
while(iter.hasNext()){
System.out.println("學生姓名:"+((Student)iter.next()).getName());//通過轉型在呼叫getName方法
}
以上這種方法可以通過轉型選擇性的輸出物件的資訊,但是需要特別注意的是,輸出只能呼叫一次 next 方法,如果多次呼叫 ,再次出現next就是下一個物件了。
迭代器的原理
迭代器為什麼是一個介面而不是一個類?
如果迭代器是一個類,這樣我們就可以建立迭代器的物件,使用該類的方法來事先集合的遍歷。但是Java中有不同的集合類,這些類的資料結構也是不同的,所以儲存方式和遍歷方式也應該是不同的,所以使用將迭代器定義為一個類是不適合的。
無論是哪種集合,都應該具備獲取元素的操作,並且最好在輔助與判斷功能,這樣在獲取前先判斷更不容易出錯,也就是說判斷功能和獲取功能應該是一個集合所具備的,而每種集合的方式也不太一樣,所以我們把這兩個功能提取出來並不具體實現,這就是介面。
真正的實現類,在真正具體的子類中,以內部類的方式體現的。
迭代器的原始碼
public interface Inteator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();
}
public interface Collection extends Iterable {
Iterator iterator();
}
public interface List extends Collection {
Iterator iterator();
}
public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {}
public Object next(){}
}
}
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}