Iterator remove()详解

简介: 一、Iterator的API      关于Iterator主要有三个方法:hasNext()、next()、remove()      hasNext:没有指针下移操作,只是判断是否存在下一个元素      next:指针下移,返回该指针所指向的元素     remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素二、迭代器原理     

一、Iterator的API
      关于Iterator主要有三个方法:hasNext()、next()、remove()
      hasNext:没有指针下移操作,只是判断是否存在下一个元素
      next:指针下移,返回该指针所指向的元素
     remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素
二、迭代器原理
     

wKioL1XwANyyvfvxAAAlGGiK240164.jpg

     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包下面的线程安全的容器解决此异常。



参考文章:

http://blog.csdn.net/scyatcs/article/details/9003295

 



本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1693218

目录
相关文章
|
7月前
list转迭代器Iterator
list转迭代器Iterator
避免list中remove导致ConcurrentModificationException
避免list中remove导致ConcurrentModificationException
48 0
|
JavaScript 前端开发 Java
彻底理解 for of 和 Iterator
本文主要来说下ES6的Iterator,目的在于理解它的概念、作用、以及现有的应用,最后学以致用。 Iterator可以说是ES6内相当重大的一个特性,也是很多其他特性运行的基石。 为什么Iterator地位如此之高呢?
125 1
彻底理解 for of 和 Iterator
List的remove操作一定要小心!
List的remove操作一定要小心!
|
Java 容器
使用Iterator遍历map以及list用法
使用Iterator遍历map以及list用法
177 0
使用Iterator遍历map以及list用法
ArrayList的remove()方法解读
remove()方法:要注意在remove()方法有两种形式: ①:remove(int index):按照集合下表查找,这个也是默认的,返回值是Object型。 ②:remove(Object o):按照value值进行移除操作涉及装箱,所以默认是第一种,其返回值是boolean型,表示操作是否成功。 remove(int index): @Test public void test1() { ArrayList arrayList...
215 0
ArrayList的remove()方法解读
|
JavaScript 索引
简单理解遍历器Iterator
简单理解遍历器Iterator
114 0
for、foreach、Iterator 比较
for、foreach循环、iterator迭代器都是我们常用的一种遍历方式,你可以用它来遍历任何东西:包括数组、集合等
for、foreach、Iterator 比较
List.remove 报错 UnsupportedOperationException
Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误。原来该List是一个AbstractList,不支持增删改操作。
1251 0