java中,遍历ArrayList的同时删除元素

发布于 2021-11-29 10:39:18 字数 997 浏览 752 评论 11

测试当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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

滥情空心 2021-11-29 12:19:34

看了一下,还是忘了Vector的存在吧

叹沉浮 2021-11-29 12:19:33

请使用 Iterator

谁的新欢旧爱 2021-11-29 12:19:31

ArrayList在遍历时删除某个元素后需要立即break, 否则就会抛出这个异常。 

类的源码木有看,可能是删除后对象结构改变,而你还在以删除前的结构遍历输出,删除后对象长度改变,导致遍历时数组越界引发异常,而在遍历过程中添加元素是不会造成这个后果滴,它在过程当中也不会输出来。

如此安好 2021-11-29 12:19:31

不能在遍历的同时 又删除元素

执手闯天涯 2021-11-29 12:19:29

建议看看ArrayList的源码,一目了然。

小瓶盖 2021-11-29 12:19:28

ArrayList在遍历时删除某个元素后需要立即break, 否则就会抛出这个异常。 

类的源码木有看,可能是删除后对象结构改变,而你还在以删除前的结构遍历输出,删除后对象长度改变,导致遍历时数组越界引发异常,而在遍历过程中添加元素是不会造成这个后果滴,它在过程当中也不会输出来。

韬韬不绝 2021-11-29 12:19:24

各位大侠给下各自的看法

无法言说的痛 2021-11-29 12:19:22

想遍历又想删除,你应该倒着来

		ArrayList<String> list = new ArrayList<String>();
		list.add("one");
		int n = list.size();
		for (int i = n - 1; i >= 0; i--)
		{
			if (list.get(i).equals("one"))
			{
				list.remove(i);
			}
		}
		System.out.println(list);

眼眸 2021-11-29 12:09:53

嗯,从代码层次看就是这样了

像你 2021-11-29 11:52:41

+1

长安忆 2021-11-29 11:36:15

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文