您的位置:首页 > 编程语言 > Java开发

JDK学习之集合包—Iterator、ListIterator、Iterable

2016-01-18 10:05 453 查看
一、接口Iterator中只有三个方法,hasNext()用来判断迭代器中是否还有元素,next()返回迭代器中的下一个元素,最需要注意的是remove()方法,JDK的注释看的头晕,所以去网上找了一篇转载过来,先附上源码吧:

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 iteratorCollection 或 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直接修改集合的内容如果要修改可以用Iteratorremove()方法

由于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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: