2022-12-15
集合 元素 代器 iterator
Iterator接口介紹
在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,Java專門提供了一個接口Iterator。Iterator接口也是集合中的一員,但它與Collection、Map接口有所不同。Collection接口與Map接口主要用于存儲元素,而Iterator主要用于迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱為迭代器。
接下來通過一個案例學習如何使用Iterator迭代集合中的元素。
Java |
當遍歷元素時,首先通過調用ArrayList集合的iterator()方法獲得迭代器對象;然后使用hasNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。需要注意的是,在通過next()方法獲取元素時,必須保證要獲取的元素存在,否則,會拋出NoSuchElementException異常。
Iterator迭代器對象在遍歷集合時,內部采用指針的方式來跟蹤集合中的元素,為了讓初學者能更好地理解迭代器的工作原理,接下來通過一個圖例演示Iterator對象迭代元素的過程。
上圖中,在調用Iterator的next()方法之前,迭代器的索引位于第一個元素之前,不指向任何元素,當第一次調用迭代器的next()方法后,迭代器的索引會向后移動一位,指向第一個元素并將該元素返回,當再次調用next()方法時,迭代器的索引會指向第二個元素并將該元素返回,以此類推,直到hasNext()方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
通過迭代器獲取ArrayList集合中的元素時,這些元素的類型都是Object類型,如果想獲取到特定類型的元素,則需要進行對數據類型強制轉換。
并發修改異常
在使用Iterator迭代器對集合中的元素進行迭代時,如果調用了集合對象的remove()方法去刪除元素之后,繼續使用迭代器遍歷元素,會出現異常。接下來通過一個案例演示這種異常。假設在一個集合中存儲了學校所有學生的姓名,由于一個名為“張三”的學生中途轉學,這時就需要在迭代集合時找出該元素并將其刪除,具體代碼如下。
|
上述程序在運行時出現了并發修改異常ConcurrentModificationException。這個異常是迭代器對象拋出的,出現異常的原因是集合在迭代器運行期間刪除了元素,會導致迭代器預期的迭代次數發生改變,導致迭代器的結果不準確。
要解決上述問題,可以采用兩種方式,下面分別介紹。
第一種方式:從業務邏輯上講只想將姓名為“張三”的學生刪除,至于后面還有多少學生并不需要關心,只需找到該學生后跳出循環不再迭代即可,也就是在第12行代碼下面增加一個break語句,代碼如下:
Java |
第二種方式:如果需要在集合的迭代期間對集合中的元素進行刪除,可以使用迭代器本身的刪除方法,將第12行代碼替換成it.remove()即可解決這個問題:
Java |
由運行結果可知,學員“張三”確實被刪除了,并且沒有出現異常。因此可以得出結論,調用迭代器對象的remove()方法刪除元素所導致的迭代次數變化,對于迭代器對象本身來講是可預知的。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號