天天看點

Iterator remove()詳解

一、iterator的api

      關于iterator主要有三個方法:hasnext()、next()、remove()

      hasnext:沒有指針下移操作,隻是判斷是否存在下一個元素

      next:指針下移,傳回該指針所指向的元素

     remove:删除目前指針所指向的元素,一般和next方法一起用,這時候的作用就是删除next方法傳回的元素

二、疊代器原理

Iterator remove()詳解

     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>

繼續閱讀