为什么再添加一个元素【如 al.add ("two");】反而没有抛出 异常了?

测试当 List 下只有一个元素时,在 Iterator 遍历过程中使用非 iterator.remove () 方式删除

public class HashMapTest {

    public static void main(String[] args) {

    ArrayList<String> al = new ArrayList<String>();

    al.add("one");

    System.out.println(al);

    Iterator<String> it = al.iterator();

    while (it.hasNext()) {

        System.out.println(it.next());

        al.remove("one");

    }

    }

}


运行结果:抛出 java.util.ConcurrentModificationException 异常

------------------

再添加一个元素【如 al.add ("two");】反而没有抛出 java.util.ConcurrentModificationException 异常了。运行结果:

[one, two]
one

-----------------
真是奇怪?!


aluckdog
浏览 121回答 3
3回答

慕无忌1623718

当使用Iterator来迭代访问Collection集合时(ArrayList实现了Collection接口),Collection集合元素是不允许直接增删的,要使用Iterator对象的it.remove()方法才行,否则就会抛出.ConcurrentModificationException异常

HUH函数

想遍历又想删除,你应该倒着来 ArrayList<String>&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList<String>(); list.add("one"); int&nbsp;n&nbsp;=&nbsp;list.size(); for&nbsp;(int&nbsp;i&nbsp;=&nbsp;n&nbsp;-&nbsp;1;&nbsp;i&nbsp;>=&nbsp;0;&nbsp;i--) { if&nbsp;(list.get(i).equals("one")) { list.remove(i); } } System.out.println(list);

BIG阳

ArrayList在遍历时删除某个元素后需要立即break, 否则就会抛出这个异常。&nbsp;类的源码木有看,可能是删除后对象结构改变,而你还在以删除前的结构遍历输出,删除后对象长度改变,导致遍历时数组越界引发异常,而在遍历过程中添加元素是不会造成这个后果滴,它在过程当中也不会输出来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java