一、iterator的api
關于iterator主要有三個方法:hasnext()、next()、remove()
hasnext:沒有指針下移操作,隻是判斷是否存在下一個元素
next:指針下移,傳回該指針所指向的元素
remove:删除目前指針所指向的元素,一般和next方法一起用,這時候的作用就是删除next方法傳回的元素
二、疊代器原理
1、當建立完成指向某個集合或者容器的iterator對象是,這是的指針其實指向的是第一個元素的上方,即指向一個 空
2、當調用hasnext方法的時候,隻是判斷下一個元素的有無,并不移動指針
3、當調用next方法的時候,向下移動指針,并且傳回指針指向的元素,如果指針指向的記憶體中沒有元素,會報異常。
4、remove方法删除的元素是指針指向的元素。如果目前指針指向的記憶體中沒有元素,那麼會抛出異常。
三、使用中注意的問題
iterator 是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 iterator 被建立之後會建立一個指向原來對象的單鍊索引表,當原來的對象數量發生變化時,這個索引表的内容不會同步改變,是以當索引指針往後移動的時候就找不到要疊代的對象,是以按照 fail-fast 原則
iterator 會馬上抛出 java.util.concurrentmodificationexception 異常。
是以 iterator 在工作的時候是不允許被疊代的對象被改變的。但你可以使用 iterator 本身的方法 remove() 來删除對象, iterator.remove() 方法會在删除目前疊代對象的同時維護索引的一緻性。
1.如果目前單個線程在更改容器(add, delete....),那麼疊代的時候采用iterator.remove()方法可以確定疊代器在查找next的時候,指針不會丢失。
while(iterator.hasnext() {
object item = iterator.next();
iterator.remove(); //避免concurrentmodificationexception
......
}
2.如果目前有多個線程在對容器進行操作,例如一個線程正在向容器中寫資料,而另一個線程在疊代此容器,這時候就必須考慮并發下的線程安全問題。concurrentmodificationexception官方文檔第一句就指出:
this exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.
這時候可以采用java.util.concurrent包下面的線程安全的容器解決此異常。
參考文章:
<a href="http://blog.csdn.net/scyatcs/article/details/9003295" target="_blank">http://blog.csdn.net/scyatcs/article/details/9003295</a>