迭代器(Iterator)
周sir |
2015年5月13日 |
Java集合框架与数据结构 |
0 条评论 | 1731
任何容器都必须能把东西放进去、再取出来。对 ArrayList,add() 负责插入,get() 是取出方式之一,还可以按下标随机访问。
若站高一层就会发现缺点:使用容器必须知道元素的确切类型和容器种类。原来是 ArrayList,后来想换成 Set,或要写不关心容器类型的通用代码,难道整段重写?这就是迭代器(Iterator)要解决的问题。
一、为什么 Collection 没有 get()
Collection 不提供 get()。要遍历其中元素,必须用 Iterator。迭代器本身是一个对象,专职遍历并选择序列里的对象,调用方不必关心底层结构。它通常是“轻量级”的,创建代价小;限制是有的迭代器只能单向移动。
Collection.iterator() 返回 Iterator,和较早的 Enumeration 类似:从头到尾遍历,并可以安全地从底层集合里删除元素。
| 方法 |
作用 |
iterator() |
容器返回一个迭代器;第一次 next() 得到第一个元素 |
next() |
返回序列中的下一个元素 |
hasNext() |
是否还有元素 |
remove() |
删除上一次 next() 返回的那个元素;每次 next 后最多调用一次 |
二、一段完整示例
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("s1");
collection.add("s2");
collection.add("s3");
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object element = iterator.next();
System.out.println("iterator = " + element);
}
if (collection.isEmpty())
System.out.println("collection is Empty!");
else
System.out.println("collection is not Empty! size=" + collection.size());
Iterator iterator2 = collection.iterator();
while (iterator2.hasNext()) {
Object element = iterator2.next();
System.out.println("remove: " + element);
iterator2.remove();
}
Iterator iterator3 = collection.iterator();
if (!iterator3.hasNext()) {
System.out.println("没有更多元素");
}
if (collection.isEmpty())
System.out.println("collection is Empty!");
}
}
运行结果(原文在空集合上打印“还有元素”,与 !hasNext() 矛盾,已改正):
iterator = s1
iterator = s2
iterator = s3
collection is not Empty! size=3
remove: s1
remove: s2
remove: s3
没有更多元素
collection is Empty!
三、使用要点
-
先
iterator() 再循环 hasNext() / next()
-
删除必须走迭代器的
remove(),不要在遍历时直接改集合
-
remove() 删除的是最近一次 next() 给出的元素
-
List 还有更强的
ListIterator(可双向、可按下标),在 List 专题里再展开
一句话总结:不想绑死 ArrayList 还是 Set,就用 Iterator 遍历:hasNext / next 取值,删除只能 iterator.remove()。
转载请注明来源:迭代器(Iterator)
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。