Collection集合遍历的三种方法
1.foreach循环遍历
格式:for(元素的数据类型 变量名:数组或集合){
}
2.使用迭代器遍历
方法名称:Iterator<E> iterator()
说明:返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素。
示例:
List<String> list = new ArrayList<>();list.add("王");list.add("小");list.add("王");list.add("小");Iterator iterator = list.iterator();while (iterator.hasNext()){System.out.print(iterator.next());}
迭代器初始在集合的第一个元素,while循环判断条件为当前元素是否为空,打印时的.next()是将索引遍历到下一个元素。
3.Lambda表达式
方法名称:default void forEach(Consumer<? super T> action)
说明:结合lambda遍历集合
Set<String> set = new HashSet<>();set.add("王");set.add("小");set.add("王");set.add("小");//用Lambda表达式遍历setset.forEach (new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});
4.认识并发修改异常问题
遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象称为并发修改异常问题。
图中通过for循环删除包含枸杞的元素,但是没有删除干净,就是发生了并发修改异常问题
原因是,当for循环中的索引i在第一个元素时,该元素不包含枸杞,i++,索引遍历至第二个元素,第二个元素包含枸杞,删除,i++,索引遍历至第三个元素,但此时红枸杞元素会因黑枸杞的删除而前移,至第二个元素,所以红枸杞未判断,没有删除。
解决并发修改异常问题的方案
① 如果集合支持索引,可以使用for循环遍历,每删除数据后做i--;或者可以倒着遍历
②)可以使用迭代器遍历,并用迭代器提供的删除方法删除数据。
注意:增强for循环/Lambda遍历均不能解决并发修改异常问题,因此增它们只适合做数据的遍历,不适合同时做增删操作,