隔着超薄肉丝进入小说_男女刺激性视频大片_女教师的诱波多野结衣_一级欧美过瘾大片

當前位置: 首頁 / 技術干貨 / 正文
Iterator接口介紹

2022-12-15

集合 元素 代器 iterator

  Iterator接口介紹

  在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,Java專門提供了一個接口Iterator。Iterator接口也是集合中的一員,但它與Collection、Map接口有所不同。Collection接口與Map接口主要用于存儲元素,而Iterator主要用于迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱為迭代器。

  接下來通過一個案例學習如何使用Iterator迭代集合中的元素。

Java
import java.util.ArrayList;
import java.util.Iterator;

public class Example03 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList(); // 創建ArrayList集合
        list.add("張三"); // 向該集合中添加字符串
        list.add("李四");
        list.add("王五");
        list.add("趙六");
        Iterator it = list.iterator(); // 獲取Iterator對象
        while (it.hasNext()) { // 判斷ArrayList集合中是否存在下一個元素
            Object obj = it.next(); // 取出ArrayList集合中的元素
            System.out.println(obj);
        }
    }
}

  當遍歷元素時,首先通過調用ArrayList集合的iterator()方法獲得迭代器對象;然后使用hasNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。需要注意的是,在通過next()方法獲取元素時,必須保證要獲取的元素存在,否則,會拋出NoSuchElementException異常。

  Iterator迭代器對象在遍歷集合時,內部采用指針的方式來跟蹤集合中的元素,為了讓初學者能更好地理解迭代器的工作原理,接下來通過一個圖例演示Iterator對象迭代元素的過程。

圖片18

  上圖中,在調用Iterator的next()方法之前,迭代器的索引位于第一個元素之前,不指向任何元素,當第一次調用迭代器的next()方法后,迭代器的索引會向后移動一位,指向第一個元素并將該元素返回,當再次調用next()方法時,迭代器的索引會指向第二個元素并將該元素返回,以此類推,直到hasNext()方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

  通過迭代器獲取ArrayList集合中的元素時,這些元素的類型都是Object類型,如果想獲取到特定類型的元素,則需要進行對數據類型強制轉換。

  并發修改異常

  在使用Iterator迭代器對集合中的元素進行迭代時,如果調用了集合對象的remove()方法去刪除元素之后,繼續使用迭代器遍歷元素,會出現異常。接下來通過一個案例演示這種異常。假設在一個集合中存儲了學校所有學生的姓名,由于一個名為“張三”的學生中途轉學,這時就需要在迭代集合時找出該元素并將其刪除,具體代碼如下。


import java.util.ArrayList;
import java.util.Iterator;

public class Example04 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList(); // 創建ArrayList集合
        list.add("張三");
        list.add("李四");
        list.add("王五");
        Iterator it = list.iterator(); // 獲得Iterator對象
        while (it.hasNext()) { // 判斷該集合是否有下一個元素
            Object obj = it.next(); // 獲取該集合中的元素
            if ("張三".equals(obj)) { // 判斷該集合中的元素是否為張三
                list.remove(obj); // 刪除該集合中的元素
            }
        }
        System.out.println(list);
    }
}

  上述程序在運行時出現了并發修改異常ConcurrentModificationException。這個異常是迭代器對象拋出的,出現異常的原因是集合在迭代器運行期間刪除了元素,會導致迭代器預期的迭代次數發生改變,導致迭代器的結果不準確。

圖片19

  要解決上述問題,可以采用兩種方式,下面分別介紹。

  第一種方式:從業務邏輯上講只想將姓名為“張三”的學生刪除,至于后面還有多少學生并不需要關心,只需找到該學生后跳出循環不再迭代即可,也就是在第12行代碼下面增加一個break語句,代碼如下:  

Java
if ("張三".equals(obj)) {
        list.remove(obj);
        break;
}

  第二種方式:如果需要在集合的迭代期間對集合中的元素進行刪除,可以使用迭代器本身的刪除方法,將第12行代碼替換成it.remove()即可解決這個問題:  

Java
if ("張三".equals(obj)) {
        it.remove();
}

   由運行結果可知,學員“張三”確實被刪除了,并且沒有出現異常。因此可以得出結論,調用迭代器對象的remove()方法刪除元素所導致的迭代次數變化,對于迭代器對象本身來講是可預知的。

分享: 更多

上一篇:LinkedList集合

下一篇:foreach循環介紹

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號