结论:fori循环可以修改、删除、添加,但是要注意的是下标还是元素;增强for循环内,可以修改,不可以删除、添加。想要删除、添加,使用集合迭代器的删除、添加方法。

对List和Set的遍历,有四种方式,下面以ArrayList为例进行说明。

1.1 fori循环
使用普通for循环的遍历方式效率最高,尽量将循环无关的代码放置在集合外执行。

代码如下:

for (int i = 0; i < list.size(); i++) {System.out.println(i);
}

如果要在普通for循环里对集合元素进行删除操作,可能会出现问题:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(2);list.add(4);list.add(5);for (int i = 0; i < list.size(); i++) {if (list.get(i) == 2) {list.remove(i);}}System.out.println(list);
}
//运行结果如下://[1, 2, 4, 5]

结果说明:

集合中有两个值为2的元素,但是在代码执行之后,值为2的元素并没有完全移除。

在第一次删除后,集合发生了改变,删除位置之后的所有元素都向前挪动了一个位置,删除位置上的元素由下一位置上的元素替代。

在下次遍历时,从删除位置后开始判断,跳过了删除位置上的元素,从而导致最后打印的结果和预期的不一致。

改进的办法是在删除之后设置索引减1,重新判断删除位置上的元素。

1.2 增强for循环
进一步精简了遍历的代码,底层使用迭代器。

代码如下:

for (Integer i : list) {System.out.println(i);
}

如果在增强for循环里删除或者添加集合元素,那么一定会报异常:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(2);list.add(4);list.add(5);for (Integer i : list) {if (i == 2) {list.remove(i);}}System.out.println(list);
}
//运行结果如下://java.util.ConcurrentModificationException

结果说明:

抛出ConcurrentModificationException异常是由快速失败(fail-fast)机制引起的,该机制是为了避免在遍历集合时,对集合的结构进行修改。

快速失败机制使用modCount记录集合的修改次数,在删除时除了删除对应元素外,还会更新modCount。

增强for循环本质上是使用迭代器进行遍历,迭代器在初始化时会使用expectedModCount记录当时的modCount,遍历时会检查expectedModCount是否和modCount相同,如果不同就会抛出ConcurrentModificationException异常。

1.3 使用迭代器
代码如下:

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}

如果在迭代器中使用集合提供的删除或添加方法,同样会报错:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(2);list.add(4);list.add(5);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {if (iterator.next() == 2) {list.add(6);}}System.out.println(list);
}
//运行结果如下://java.util.ConcurrentModificationException

结果说明:

这里抛出异常的原因和增强for循环一样,同样是因为快速失败机制。

解决办法是在迭代器中删除或添加元素时,使用迭代器提供的删除或添加方法,不要使用集合提供的删除或添加方法。

需要注意的是,普通迭代器中只提供了删除方法,在集合迭代器中还提供了添加和修改方法。

1.4 使用集合迭代器
代码如下:

ListIterator<Integer> iterator = list.listIterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}

在迭代器中使用迭代器提供的删除或添加方法:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(2);list.add(4);list.add(5);ListIterator<Integer> iterator = list.listIterator();while (iterator.hasNext()) {if (iterator.next() == 2) {iterator.remove();}}System.out.println(list);
}
//运行结果如下://[1, 4, 5]

结果说明:

迭代器提供的方法同时维护了modCount和expectedModCount,所以不会产生快速失败。

1.5 使用forEach方法
forEach方法是JDK1.8新增的方法,需要配合Lambda表达式使用,代码如下:

list.forEach(i -> System.out.println(i));

使用forEach方法遍历:

public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(2);list.add(4);list.add(5);list.forEach(i -> {if (i == 2) {list.remove(i);}});System.out.println(list);
}
//运行结果如下://java.util.ConcurrentModificationException

结果说明:

这里抛出异常的原因也是因为快速失败机制。

Java遍历集合元素并修改相关推荐

  1. java遍历集合元素_遍历java集合元素的方法

    java集合由两个接口派生出来:Collection和Map. 遍历Collection的实现类: ,因此对Collection的实现类来说,遍历方法基本一致: 1.使用Lambda表达式遍历集合.这 ...

  2. 1.10 Iterator(迭代器)遍历集合元素

    Iterator(迭代器)遍历Collection集合元素 Iterator(迭代器)是一个接口,它的作用就是遍历容器的所有元素,也是 Java 集合框架的成员,但它与 Collection 和 Ma ...

  3. java遍历集合的方法

    java中,集合的遍历是一项基本且重要的技能.我们不仅要知道集合中元素的个数,还要知道元素的值,以及它们之间的关系. 在 Java中,如果需要遍历集合中的某个元素,可以使用以下方法: 1.通过 ret ...

  4. 使用foreach循环遍历集合元素

    使用foreach循环遍历集合元素 Java5.0 提供了foreach循环迭代访问Collection和数组 遍历操作不需要获取Collection或数组的长度,无需使用索引访问元素 遍历集合的底层 ...

  5. java遍历集合中的元素_java中如何遍历ArrayList集合中的元素并输出

    问题: 假设集合ArrayList中存储的元素是整形数字1~5,遍历每个元素,将每个元素顺序输出. 在线学习视频推荐:java教学视频 示例如下:package work10; import java ...

  6. Java中遍历集合的并发修改异常解决方案

    遍历集合的删除元素的问题 问题引出: 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题. 哪些变量会存在这个问题? 迭代器遍历集合且直接用集合删除元素的时候可能出现, 例如 ...

  7. Java—遍历集合的N种方式总结Collections工具类

    遍历集合的N种方式总结 [示例1]遍历List方法1,使用普通for循环 for(int i=0;i<list.size();i++){         //list为集合的对象名 String ...

  8. java删除集合元素吗_java如何删除集合中的元素

    java如何删除集合中的元素 如何使用java删除集合中的'元素呢?下面是小编给大家提供的删除集合中元素的常见方法,欢迎阅读,更多详情请关注应届毕业生考试网. Java代码如下: package co ...

  9. Java 获取集合元素的值

    遍历从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型的集合,我们分别使用了普通for,增强型的 for ,iterator 等方式来遍历集合 完整代码 import ...

最新文章

  1. Skype For Business 2015 综合部署系列一:Skype 环境需求及部署规划
  2. DialogFragment 全屏显示
  3. (摘)Excel 2007查询操作中的函数应用
  4. 【机器学习】数据挖掘算法——关联规则(一),相关概念,评价指标
  5. Android学习笔记(一)
  6. 10亿个数中找出最大的10000个数
  7. vmware中centos6.4突然无法进入图形界面解决方法
  8. [转载] Java-forEach增强for循环是值传递规则详解
  9. java.io和util的区别_Java NIO与IO的区别和比较
  10. LeetCode刷题(25)
  11. java设计模式(2) - 结构型模式
  12. MAC Terminal 用颜色区分不同类型的文件
  13. 孙鑫VC学习笔记:第十三讲 (六) 关于释放内存
  14. 查看pcie总线上的设备ID以及带宽计算
  15. 缅怀清明-记爷爷这一生
  16. iOS12.3正式版不能更新是怎么回事(解决办法)
  17. scratch案例——音乐
  18. Ionic3项目实战
  19. Android 实现拍照、录像
  20. B树完整实现(附详细注释)

热门文章

  1. 高项 22 综合测试管理
  2. AHP层次分析法理解以及项目实战
  3. pc上火车票抢票神器
  4. 2246xt u盘开卡详细教程_电脑重装系统:常规U盘PE装机详细教程~
  5. java 记录错误日志文件_java日志记录错误的文件_方法_行号_报错信息
  6. rebol sdk 2.7.7 license
  7. ssm+Vue计算机毕业设计校园舆情监控系统(程序+LW文档)
  8. 积分制管理系统:其它可增加积分的功能
  9. rtk打点,导入arcgis并进行格式变换
  10. 有效更改Chrome浏览器缓存位置到虚拟硬盘