JDK学习之集合包—Iterator、ListIterator、Iterable
2016-01-18 10:05
453 查看
一、接口Iterator中只有三个方法,hasNext()用来判断迭代器中是否还有元素,next()返回迭代器中的下一个元素,最需要注意的是remove()方法,JDK的注释看的头晕,所以去网上找了一篇转载过来,先附上源码吧:
现在说一下remove():(转载)
jdk5.0以上的for-each也是利用内部的iterator来遍历集合的(跟以前的iterator一样)获得的Iterator是一个内部类产生的迭代器,这个迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。进一步说,当使用
fail-fast iterator 对Collection 或 Map 进行迭代操作过程中尝试直接修改Collection
/ Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。Iterator
是工作在一个独立的线程中,并且拥有一个 mutex 锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照
fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。 所以Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用Iterator
本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的
Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness:
ConcurrentModificationException should be used only to detect bugs.
解决方法:在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法
由于for-each的写法,使我们无法获得iterator对象,所以这种遍历方式不能进行删除操作。只好改成了比较土的方法实现了,如下:
for (Iterator it = desk.getPkers().iterator(); it.hasNext();) {
PKer pkerOnDesk =(PKer) it.next();
it.remove();
}
二、ListIterator继承了Iterator,扩展了很多功能,是一个比Iterator强大的多的迭代器,先附上源码:
三、Iterable:
一目了然,不做过多描述:
package java.util; public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
现在说一下remove():(转载)
jdk5.0以上的for-each也是利用内部的iterator来遍历集合的(跟以前的iterator一样)获得的Iterator是一个内部类产生的迭代器,这个迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。进一步说,当使用
fail-fast iterator 对Collection 或 Map 进行迭代操作过程中尝试直接修改Collection
/ Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。Iterator
是工作在一个独立的线程中,并且拥有一个 mutex 锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照
fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。 所以Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用Iterator
本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的
Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness:
ConcurrentModificationException should be used only to detect bugs.
解决方法:在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法
由于for-each的写法,使我们无法获得iterator对象,所以这种遍历方式不能进行删除操作。只好改成了比较土的方法实现了,如下:
for (Iterator it = desk.getPkers().iterator(); it.hasNext();) {
PKer pkerOnDesk =(PKer) it.next();
it.remove();
}
二、ListIterator继承了Iterator,扩展了很多功能,是一个比Iterator强大的多的迭代器,先附上源码:
package java.util; public interface ListIterator<E> extends Iterator<E> { boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); void set(E e); void add(E e); }ListIterator中出了最普通的向后迭代之外,添加了向前迭代的功能。还有额外添加的四个方法:nextIndex()和previousIndex()是返回下一个或上一个元素的索引位置;set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e;add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前。
三、Iterable:
一目了然,不做过多描述:
package java.lang; import java.util.Iterator; /** Implementing this interface allows an object to be the target of * the "foreach" statement. * @since 1.5 */ public interface Iterable<T> { /** * Returns an iterator over a set of elements of type T. * * @return an Iterator. */ Iterator<T> iterator(); }
相关文章推荐
- Java实现爬虫给App提供数据(Jsoup 网络爬虫)
- 用 java 编写 windows 程序
- Java学习笔记(47)-----------泛型详解
- Java学习笔记(46)------------知识学习宝库!
- Java学习笔记(45)------------Hashcode的作用
- Java学习笔记(44)----------探索equals()和hashCode()方法
- Java学习笔记(42)----------HashTable,HashMap和HashSet
- Java学习笔记(41)----------Red-Black Trees(红黑树)
- JAVA基础之集合框架
- eclipse注释模板修改
- Java学习笔记(40)----------TreeMap和TreeSet
- Java学习笔记(39)-----------Map集合
- Java学习笔记(37)----------List集合
- java中的native关键字
- Java学习笔记(36)-----------Set集合
- SpringSecurity自定义过滤器
- Java学习笔记(35)----------Collection接口
- Java学习笔记(34)----------Iterator、Collection接口以及foreach
- Java学习笔记(33)----------java集合概念和作用
- Java学习笔记(32)-----------与运行环境交互