迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。java
在遍历容器时,咱们可使用for循环或者是加强for循环,可是不一样的集合结构在遍历时,咱们要针对集合特色采起不一样的方式,好比List是链表,咱们能够直接当作数组处理,但Map是Key—Value的形式,咱们只有获取了键名才能去遍历集合内容。设计模式
很麻烦对吧?
还好JDK为咱们提供了一个接口-------Iterator(迭代器),迭代器为各类容器提供了公共的操做接口。这样使得对容器的遍历操做与其具体的底层实现相隔离,达到解耦的效果。数组
查看Iterator的API咱们得知,该接口共有3个方法:并发
查看API发现Collection实现了该接口,也就是说Collection的全部子实现类可以使用Iterator的方法,同时在Collection中定义了一个方法iterator()spa
使用该方法iterator(),要求容器返回一个Iterator对象。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
那咱们如何使用迭代器呢?设计
示例代码以下,关键代码的解释说明已经在注释部分给出,将再也不作赘述。指针
示例代码:code
/** * + 上海尚学堂 shsxt.com */ public class TestIterator { public static void main(String[] args) { List<String> list= new ArrayList(); list.add("and"); list.add("try"); list.add("your"); list.add("best"); //使用迭代器,对集合Arraylist中的元素进行取出 //调用集合的方法iterator() 获取Iterator接口的实现类对象() Iterator<String> it=list.iterator(); System.out.println(list.iterator().getClass());//打印的内容是 class java.util.ArrayList$Itr 既是咱们的接口的实现类对象 //接口实现类对象,调用方法hasNext()判断集合中是否有元素 boolean b = it.hasNext(); System.out.println(b); //接口的实现类对象,调用方法next()取出集合中的元素 String s = it.next(); System.out.println("it.next()"+s); while(it.hasNext()){ /* * 这里将不会输出"and",由于咱们调用一次hasNext,内部的指针就会指向下一个元素 */ System.out.println(it.next()); } } }
会遇到的问题(并发修改异常)
咱们来设想以下的场景: 在list集合迭代元素中,对元素进行判断,一旦条件知足就添加一个新元素。代码以下对象
/** * + VX:java8733 获取更多资源 */ List<String> list2 = new ArrayList<String>(); list2.add("abc"); list2.add("def"); list2.add("g"); Iterator<String> it=list2.iterator(); while(it.hasNext()){ String str=it.next(); if("g".equals(str)){ //该操做会致使程序异常: ConcurrentModificationException List2.add("b"); } } System.out.println(list2);
咱们会发现当咱们使用迭代器遍历元素的时候,经过集合是不能修改元素的。程序抛出异常ConcurrentModificationException,这个异常指的是当方法检测到对象的并发修改,但不容许这种修改时,就会抛出此异常。blog
这是为何呢? why?
迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器殊不知道,因此就报错了,这个错叫并发修改异常。
那咱们应该如何解决呢?
首先,在迭代时,尽可能不要使用集合的方法操做元素。若是要在迭代时对元素操做。咱们能够经过ListIterator迭代器来操做元素。
咱们能够将上面的代码作以下的修改就能够操做list中的元素了
/** * 上海尚学堂 shsxt.com */ ListIterator<String> it=list2.listIterator(); while(it.hasNext()){ String str=it.next(); if("a".equals(str)){ //子接口ListIterator包含add()方法 it.add("b"); } }
上海尚学堂Java原创文章,感谢您阅读,后续Java技术文章陆续奉上,请多关注