需求:
给List集合中存储一些字符串元素,判断这个集合如果有"world"元素,给集合中添加"javaee"元素
我们分析:
首先先创建一个集合对象,给里面添加元素 存在"world"元素使用迭代器遍历
list集合,通过next()获取每一个元素 String s = (String)(it.next()) ;判断如果当前s中存在"world"元素,集合添加元素 输出list集合对象
public class ListTest { public static void main(String[] args) { //创建一个集合对象 List list = new ArrayList() ; //给集合中添加一些字符串元素 list.add("hello") ; list.add("world") ; list.add("java") ; list.add("php") ; //使用迭代器遍历元素 Iterator it = list.iterator() ; while(it.hasNext()) { //获取下一个元素 String s = (String)(it.next()) ; //判断如果当前字符串有world元素,给集合中新添加一个元素 if("world".equals(s)) { //给集合中添加元素 list.add("javaee") ; } } System.out.println("list:"+list); } }
然后运行报错: java.util.ConcurrentModificationException:并发修改异常 我们在使用迭代器遍历元素时,不能使用集合添加元素(迭代器遍历的元素,给集合中添加元素,迭代器不知道集合新添加的元素) 并发:某个时间点,多个对象都在使用同一个数据.
如何解决当前并发修改异常
1)如果使用迭代器遍历元素,就使用迭代器添加元素 (只能使用列表迭代器,在获取下一个 元素前插入元素)
public class ListTest { public static void main(String[] args) { //创建一个集合对象 List list = new ArrayList() ; //给集合中添加一些字符串元素 list.add("hello") ; list.add("world") ; list.add("java") ; list.add("php") ; //使用迭代器遍历元素 ListIterator lit = list.listIterator() ; while(lit.hasNext()) { String s = (String)(lit.next()) ; //判断是否存在“world”元素 if("world".equals(s)){ //使用迭代器添加元素 lit.add("javaee"); } } System.out.println("list:"+list); } }
2)如果使用集合遍历元素:普通for循环(size()和get(int index))相结合,使用集合添加 元素(在末尾添加元素)
public class ListTest { public static void main(String[] args) { //创建一个集合对象 List list = new ArrayList() ; //给集合中添加一些字符串元素 list.add("hello") ; list.add("world") ; list.add("java") ; list.add("php") ; for(int x = 0 ; x < list.size() ; x ++) { //获取并判断 String s = (String)(list.get(x)) ; if("world".equals(s)) { //所有集合都重写了equals方法,默认内容是否相同 //使用集合添加元素 list.add("javaee") ; } } System.out.println("list:"+list); } }