Java 7中如何使用Iterator从List<List<Address>>中删除子列表?
在Java 7中遍历并删除
List<List<Address>>元素的解决方案 在Java 7里直接用增强for循环遍历List<List<Address>>并删除元素肯定会踩坑——因为增强for循环底层依赖迭代器,但如果直接调用集合的remove()方法,会触发ConcurrentModificationException(并发修改异常)。下面给你两种靠谱的实现方式:
方法一:从后往前的普通for循环
这种方式通过反向遍历集合,避免删除元素后导致的索引错位问题,代码简单直观:
List<List<Address>> addressLists = ...; // 你的目标集合 // 从最后一个元素开始往前遍历 for (int i = addressLists.size() - 1; i >= 0; i--) { List<Address> listOfAddress = addressLists.get(i); // 执行你的地址处理逻辑 for (Address address : listOfAddress) { // some code } // 处理完成后删除当前子列表 addressLists.remove(i); }
为什么要反向遍历?因为如果从前往后删,删除第i个元素后,后面的元素都会往前挪一位,下一次循环的i++会跳过原本的第i+1个元素;而反向遍历的话,删除的是当前末尾的元素,不会影响前面未遍历的元素索引。
方法二:使用Iterator迭代器(推荐)
这是Java中遍历并修改集合的标准安全方式,迭代器的remove()方法会同步更新迭代器和集合的状态,彻底避免并发修改异常:
List<List<Address>> addressLists = ...; // 你的目标集合 Iterator<List<Address>> iterator = addressLists.iterator(); while (iterator.hasNext()) { List<Address> listOfAddress = iterator.next(); // 执行你的地址处理逻辑 for (Address address : listOfAddress) { // some code } // 用迭代器的remove方法删除当前元素 iterator.remove(); }
注意:绝对不要在增强for循环里直接调用addressLists.remove(listOfAddress),这种操作会让迭代器检测到集合结构被修改,立刻抛出异常。
内容的提问来源于stack exchange,提问作者user8181539
相关产品推荐
相关产品推荐

