/*
* 需求:遍历集合,如果集合中有world这个元素,我就在添加一个元素:android
*
* java.util.ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 并发修改异常。
*
* 这个时候,为什么会报错呢?
* 回想一下,迭代器是怎么存在的。
* 先有集合,才有迭代器,迭代器是依赖于集合而存在。
* 而我们现在,是在使用迭代器的同时,通过集合去修改了集合元素。这个时候,集合的内部就发生了改变,
* 而迭代器并不知道这些,所以,再次迭代的时候就报错了,错误的原因:你在用迭代器迭代的时候,用集合修改了集合中的元素。
*
* 解决问题方案:
* A:用迭代器迭代,用迭代器修改集合元素
* <span style="white-space:pre"> </span>这个时候,元素是直接添加到查找的元素后面,不是在末尾处添加。
* B:用集合遍历,用集合修改集合元素
* <span style="white-space:pre"> </span>这个时候,元素是在集合的末尾添加。
* <span style="white-space:pre"> </span>你有没有听说过并发修改异常?如果有,请问在哪里见过?怎么产生的?怎么解决的?
*/
List<String> list2 = new ArrayList<>();
list2.add("hello");
list2.add("world");
list2.add("Java");
// 方式1 不可用
// Iterator<String> iterator2 = list2.iterator();
// // java.util.ConcurrentModificationException 并发修改异常
// while (iterator2.hasNext()) {
// String string = iterator2.next();
// if ("world".equals(string)) {
// list2.add("we");
// }
// }
// 方式2 不可用
// // java.util.ConcurrentModificationException
// for (String string : list2) {
// if ("Objective-c".equals(string)) {
// list2.add("swift");
// }
// }
// 方式3 可用
ListIterator<String> lIterator = list2.listIterator();
while (lIterator.hasNext()) {
String string = lIterator.next();
if ("world".equals(string)) {
System.out.println("----------------------");
lIterator.add("Objective-c");
// [hello, world, Objective-c, Java]
}
}
System.out.println(list2);
// 方式4 可用的
for (int i = 0; i < list2.size(); i++) {
String string = list2.get(i);
if ("Objective-c".equals(string)) {
list2.add("swift");
// [hello, world, Objective-c, Java, swift]
}
}
System.out.println(list2);