参考:
https://www.cnblogs.com/zyuze/p/7726582.html
https://blog.youkuaiyun.com/wangjun5159/article/details/61415358
迭代器模式:就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
概述
Java集合框架的集合类,我们有时候称之为容器。容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。
因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,Java引入了迭代器模式!
把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。
package java.util; public interface Iterator<E> { boolean hasNext();//判断是否存在下一个对象元素 E next();//获取下一个元素 void remove();//移除元素 }
public interface Iterable<T> { /** * Returns an iterator over elements of type {@code T}. * * @return an Iterator. */ Iterator<T> iterator();}
总之, Iterable 方法要求实现一个迭代器(Iterator的实现类).
foreach是JDK1.5新增加的一个循环结构,foreach的出现是为了简化我们遍历集合的行为。而要想使用foreach, 就必须要实现Iterable接口.(本质上来讲,Foreach其实就是在使用迭代器).
public static void remove(ArrayList<String> list) { //建议使用forEach 循环, 要求实现了Iterable接口,迭代器模式.(由于涉及删除) for (Iterator<String> it = list.iterator(); it.hasNext();) { String s = it.next(); if (s.equals("b")) { it.remove(); } } }
在idea 里编写这段代码的时候, 有一个warning比较令人好奇.
具体意思是建议我们使用foreach循环, 但是这里的情况比较特殊, 如果使用foreach循环会抛出异常.
具体参看: