迭代器(Iterator)

    |     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)
本文链接地址:https://ai.zhousir.top/?p=650
回复 取消