迭代器原理介绍
當遍歷集合或者數組時,通常用for循環來遍歷,這種遍歷方式效率低下,本文介紹一種迭代器能夠提高效率,快速遍歷!
首先,要知道迭代器是什么?
迭代的概念
迭代:即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。
獲取迭代器對象
Collection集合提供了一個獲取迭代器的方法:
- public Iterator iterator(): 獲取集合對應的迭代器,用來遍歷集合中的元素的。
Iterator接口的常用方法
- public E next():返回迭代的下一個元素。
- public boolean hasNext():如果仍有元素可以迭代,則返回 true。
案例演示
public class IteratorDemo {public static void main(String[] args) {// 創建一個Collection集合對象,指定集合中元素的類型為StringCollection<String> coll = new ArrayList<>();// 往集合中添加元素: public boolean add(E e)coll.add("李冰冰");coll.add("范冰冰");coll.add("高圓圓");coll.add("陳圓圓");// 遍歷coll集合中的元素:使用Collection集合中的迭代器// 獲取coll集合對應的迭代器Iterator<String> it = coll.iterator();// 循環使用迭代器進行判斷while (it.hasNext()) {// 使用迭代器取出元素String next = it.next();System.out.println("取出來的元素:"+next);}System.out.println("源集合:"+coll);// 源集合:[李冰冰, 范冰冰, 高圓圓, 陳圓圓]} }迭代器的常見問題
常見問題一
-
在進行集合元素獲取時,如果集合中已經沒有元素可以迭代了,還繼續使用迭代器的next方法,將會拋出java.util.NoSuchElementException沒有集合元素異常。
public static void main(String[] args) throws Exception{Collection<String> coll = new ArrayList<>();coll.add("李冰冰");coll.add("范冰冰");coll.add("高圓圓");coll.add("陳圓圓");Iterator<String> it = coll.iterator();while (it.hasNext()) {String s = it.next();System.out.println(s);//正確}System.out.println("=====================");System.out.println(it.next());//集合中已經沒有元素可以迭代了 報異常} -
解決辦法: 如果還需要重新迭代,那么就重新獲取一個新的迭代器對象進行操作
常見問題二
-
在進行集合元素迭代時,如果添加或移除集合中的元素 , 將無法繼續迭代 , 將會拋出ConcurrentModificationException并發修改異常.
public static void main(String[] args) throws Exception{Collection<String> coll = new ArrayList<>();coll.add("李冰冰");coll.add("范冰冰");coll.add("高圓圓");coll.add("陳圓圓");Iterator<String> it = coll.iterator();while (it.hasNext()) {String s = it.next();System.out.println(s);//coll.add("章子怡");// 報異常//coll.remove(s);// 報異常it.remove();}System.out.println("====================="+coll); }
迭代器的實現原理
講解:
? 在之前案例已經完成了Iterator遍歷集合的整個過程。當遍歷集合時,首先通過調用t集合的iterator()方法獲得迭代器對象,然后使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。
? **Iterator迭代器對象在遍歷集合時,內部采用指針的方式來跟蹤集合中的元素。**在調用Iterator的next方法之前,迭代器的索引位于第一個元素之前,不指向任何元素,當第一次調用迭代器的next方法后,迭代器的索引會向后移動一位,指向第一個元素并將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素并將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
下圖是迭代器迭代時圖解:
知道了迭代器原理,明白了怎么進行迭代,接下來介紹一個循環:
增強for循環
講解:
增強for循環(也稱for each循環)是JDK1.5以后出來的一個高級for循環,專門用來遍歷數組和集合的。它的內部原理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。
格式:
for(元素的數據類型 變量名 : Collection集合or數組){ //寫操作代碼 }它用于遍歷Collection和數組。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。
代碼演示
public class Test {public static void main(String[] args) {// 增強for循環遍歷集合Collection<String> col = new ArrayList<>();// 添加元素col.add("張柏芝");col.add("邱淑貞");col.add("王祖賢");col.add("關之琳");for (String name : col) {System.out.println("name:" + name);}System.out.println("==========================================");// 增強for循環遍歷數組String[] arr = {"張柏芝","邱淑貞","王祖賢","關之琳"};for (String name : arr) {System.out.println("name:"+name);}} }tips:
增強for循環必須有被遍歷的目標,目標只能是Collection或者是數組;
增強for(迭代器)僅僅作為遍歷操作出現,不能對集合進行增刪元素操作,否則拋出ConcurrentModificationException并發修改異常
總結
- 上一篇: SOHO如何给产品定价?如何报价?
- 下一篇: Verilog:generate-for