Iterator主要有三个方法:hasNext()、next()、remove()详解
Iterator主要有三個(gè)方法:hasNext()、next()、remove()詳解
一、Iterator的API
關(guān)于Iterator主要有三個(gè)方法:hasNext()、next()、remove()hasNext:沒(méi)有指針下移操作,只是判斷是否存在下一個(gè)元素next:指針下移,返回該指針?biāo)赶虻脑豶emove:刪除當(dāng)前指針?biāo)赶虻脑?#xff0c;一般和next方法一起用,這時(shí)候的作用就是刪除next方法返回的元素二、迭代器原理
1、當(dāng)創(chuàng)建完成指向某個(gè)集合或者容器的Iterator對(duì)象時(shí),這時(shí)的指針其實(shí)指向的是第一個(gè)元素的上方,即指向一個(gè) 空
2、當(dāng)調(diào)用hasNext方法的時(shí)候,只是判斷下一個(gè)元素的有無(wú),并不移動(dòng)指針
3、當(dāng)調(diào)用next方法的時(shí)候,向下移動(dòng)指針,并且返回指針指向的元素,如果指針指向的內(nèi)存中沒(méi)有元素,會(huì)報(bào)異 常。
4、remove方法刪除的元素是指針指向的元素。如果當(dāng)前指針指向的內(nèi)存中沒(méi)有元素,那么會(huì)拋出異常。
三、迭代器的用途
迭代器一般會(huì)用在遍歷集合上面。
四、使用中注意的問(wèn)題
Java中的Iterator是一種fail-fast的設(shè)計(jì)。當(dāng)Iterator迭代一個(gè)容器的時(shí)候,如果此時(shí)有別的方法在更改Collection(容器)的內(nèi)容,那么Iterator就會(huì)拋出ConcurrentModificationException 。正如官方文檔中反復(fù)強(qiáng)調(diào)的:Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.為了避免此Exception的發(fā)生,可以采取的解決方法是:1.如果當(dāng)前單個(gè)線程在更改容器(add, delete…),那么迭代的時(shí)候采用iterator.remove()方法可以確保迭代器在查找next的時(shí)候,指針不會(huì)丟失。
while(iterator.hasNext() {Object item = iterator.next();iterator.remove(); //Important! 避免 ConcurrentModificationException......}2.如果當(dāng)前有多個(gè)線程在對(duì)容器進(jìn)行操作,例如一個(gè)線程正在向容器中寫(xiě)數(shù)據(jù),而另一個(gè)線程在迭代此容器,這時(shí)候就必須考慮并發(fā)下的線程安全問(wèn)題。ConcurrentModificationException官方文檔第一句就指出:
This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
這時(shí)候可以采用java.util.concurrent包下面的線程安全的容器解決此異常。
最后要說(shuō)的是,ConcurrentModificationException應(yīng)該永遠(yuǎn)被用于解決一個(gè)bug,而不是檢查程序的正確性(try…catch…)。
總結(jié)
以上是生活随笔為你收集整理的Iterator主要有三个方法:hasNext()、next()、remove()详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数字信号处理学习笔记(一)|离散傅里叶变
- 下一篇: Java –什么是瞬态字段?