原因:使用Collection接口中的迭代器来遍历数据过程中,往 ArrayList 集合中添加数据时,由于迭代器是通过目录来查找ArrayList集合中的内容并显示遍历结果和ArrayList集合本身不属于同一个,集合内容更新和目录更新不同步,所以出现异常。使用增强for循环遍历一样,底层也是使用迭代器,底层代码没有提供add方法。
package com.hbu.jfp;/*
*@ClassName Demo06
*@Description: TODO
*@Author: 1367673304@qq.com
*/
import java.util.ArrayList;
import java.util.Iterator;
public class Demo06 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("C++");
list.add("C");
list.add("PHP");
list.add("JavaScript");
list.add("JQuery");
// 如果集合中存在 C++ 的话,就添加 "学习算法的一门好语言" 的知识点内容
Iterator<String> it = list.iterator();
while (it.hasNext()){
String str = it.next();
if ("C++".equals(str))
list.add("学习算法的一门好语言");
}
}
}
结果图片:
解决方案:
1.使用for循环
package com.hbu.jfp;/*
*@ClassName Demo06
*@Description: TODO
*@Author: 1367673304@qq.com
*/
import java.util.ArrayList;
import java.util.Iterator;
public class Demo06 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("C++");
list.add("C");
list.add("PHP");
list.add("JavaScript");
list.add("JQuery");
// 如果集合中存在 C++ 的话,就添加 "学习算法的一门好语言" 的知识点内容
// Iterator<String> it = list.iterator();
//
// while (it.hasNext()){
// String str = it.next();
// if ("C++".equals(str))
// list.add("学习算法的一门好语言");
// }
//解决方案1
for (int i = 0; i < list.size(); i++) {
if ("C++".equals(list.get(i)))
list.add(i + 1, "学习算法的一门好语言");
}
System.out.println(list);
}
}
结果图片
2.解决方案2
使用ArrayList的专属迭代器
package com.hbu.jfp;/*
*@ClassName Demo06
*@Description: TODO
*@Author: 1367673304@qq.com
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class Demo06 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("C++");
list.add("C");
list.add("PHP");
list.add("JavaScript");
list.add("JQuery");
// 如果集合中存在 C++ 的话,就添加 "学习算法的一门好语言" 的知识点内容
// Iterator<String> it = list.iterator();
//
// while (it.hasNext()){
// String str = it.next();
// if ("C++".equals(str))
// list.add("学习算法的一门好语言");
// }
//解决方案1
// for (int i = 0; i < list.size(); i++) {
// if ("C++".equals(list.get(i)))
// list.add(i + 1, "学习算法的一门好语言");
// }
// 解决方案2
ListIterator<String> it = list.listIterator();
while (it.hasNext()){
String str = it.next();
if ("C++".equals(str))
it.add("学习算法的一门好语言");
}
System.out.println(list);
}
}
结果截图
底层代码分析:底层提供Add方法