1 异常场景(Exception Scene)
当集合在进行迭代操作时,如果此时对集合的长度进行更改,就会报ConcurrentModificationException(并发修改异常)
2 异常示例(Exception Examples)
2.1 对List集合的"增,删"操作,改变了集合的长度,因此会报异常
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for (String s : list) {
list.add("4");
list.remove(2);
}
2.2 对Set集合的"增,删"操作,改变了集合的长度,因此会报异常
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
for (String s : set) {
set.add("4");
set.remove("2");
}
2.3 对List集合的"改"操作,未改变集合的长度,因此无异常
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for (String s : list) {
System.out.println(s);
list.set(2,"三");
}
3 异常解决(Exception Solve)
3.1 原因分析
上面的例子中的for循环,都是采用的"增强for循环",底层是使用了"集合迭代器Iterator",因此迭代过程无法对集合长度进行修改
3.2 解决办法
3.2.1 解决List集合
使用"普通for循环"替代"增强for循环",在遍历集合的过程中就可以改变集合的长度了
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for (int i = 0; i <= 3; i++) {
if (i == 3) {
list.add("4");
}
System.out.println(list.get(i));
}
3.2.2 解决Set集合
(特别说明:对于Set集合的遍历,只能使用增强for循环)
做一个Set集合的"克隆Set", 用"克隆Set"进行增强for循环,但操作的却是"原始Set集合"
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
// 做一个"克隆Set"
Set<String> setCopy = new HashSet<>();
for (String value : set) {
setCopy.add(value);
}
for (String value : setCopy) {
set.remove("2");
}