Iterator迭代输出
集合输出实际上从JDK1.8开始就在Interable接口之中提供有一个forEach(), 但是这种方法的的输出并不是传统意义上的输出形式,并且也很难在实际的开发之中出现,对于集合操作而言,应该定义了四种输出形式:
- 迭代输出:Iterator(95%)
- 双向迭代输出:ListIterator
- 枚举输出:Enumeration
- forEach输出
通过Collection接口的继承关系可以发现,从JDK1.5开始起多继承了Iterable父接口,并且在这个接口里面定义有iterator()操作方法,通过此方法可以获取Iterator接口对象(在JDK1.5之前,这一方法直接定义在Collection中)
获取Iterator接口对象:Iterator<T> iterator();
在Iterator定义有如下的方法:
- 判断是否有数据:boolean hasNext();
- 返回迭代中的下一个元素:E next();
- 删除:default void remove();
在之前使用的java.util.Scanner类就是Iterator接口的子类,所以此时类继承关系如下:
范例:使用Iterator输出
import java.util.Iterator;
import java.util.Set;
public class IteratorDemo {
public static void main(String[] args) {
Set<String> set= Set.of("Hello","Word!");
Iterator<String> iterator = set.iterator(); //实例化iterator对象
while (iterator.hasNext()){ //如果有下一个数值
String str =iterator.next(); //返回迭代中的下一个元素
System.out.println(str);
}
}
}
Hello
Word!
但是对于Itertor接口中的remove()方法的使用需要特别注意(如果不是必须不要使用)。实际上在Collection接口中定义有数据的删除方法,但是在进行迭代输出的过程里面如果使用了Collection中的remove()方法会导致迭代失败。
面试题:请解释Collection.remove()与Iterator.remove()的区别?
- 在进行迭代输出的时候如果使用了Collection.remove()则会造成并发更新的异常,导致程序删除出错,此时只能用Iterator中的remove()正常删除。