Java集合框架之迭代器(Iterator)

1. Iterator 接口

public interface Iterator {

    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

1.1 Iterator遍历

@Test
public void test() {
    List list = new ArrayList();
    list.add("111");
    list.add("222");
    list.add("333");

    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
        String next = iterator.next();
    }
}

多层遍历

@Test
public void test() {
    Map> map = new HashMap();
    map.put(1001L, new HashSet(Arrays.asList("aaa", "bbb")));
    map.put(1002L, new HashSet(Arrays.asList("ccc")));

    // Iterator> iterator = map.values().iterator();
    String next = map.values().iterator().next().iterator().next();
    // 输出 next: aaa
}

1.2 遍历时注意事项

迭代过程中不能进行删除、添加操作,会抛异常java.util.ConcurrentModificationException

@Test
public void test() {
    List list = new ArrayList();
    list.add("111");
    list.add("222");
    list.add("333");

    for (String str : list) {
        if ("111".equals(str)) {
            list.remove("111");
            // list.add("444");
        }
    }
}

报错原因:

private class Itr implements Iterator {
    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}

改为iterator.remove()

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
    if ("111".equals(iterator.next())) {
        iterator.remove();
    }
}

2. Iterable 接口

public interface Iterable {

    Iterator iterator();

    default void forEach(Consumer super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
}

实现 Iterable 接口,就拥有了获取迭代器的能力

2.1 集合里的迭代器

Collection 继承了 Iterable 接口

public interface Collection extends Iterable {
    Iterator iterator();
}
public interface List extends Collection {
    Iterator iterator();
}
public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable {

    public Iterator iterator() {
        return new Itr();
    }

    // 内部类实现了 Iterator
    private class Itr implements Iterator {
        public boolean hasNext() {}

        public E next() {}

        public void remove() {}
    }

}

2.2 Iterable 存在的意义

解耦,有些集合有多个 Iterator 内部类,可以获取不同的 Iterator 执行不一样的操作,比如ArrayList,LinkedList

public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable {

    public ListIterator listIterator() {
        return new ListItr(0);
    }

    public Iterator iterator() {
        return new Itr();
    }

    private class Itr implements Iterator {}

    private class ListItr extends Itr implements ListIterator {}
}

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容