Java中使用addAll方法,抛出ConcurrentModificationException,请问问题出在哪儿?怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中使用addAll方法,抛出ConcurrentModificationException,请问问题出在哪儿?怎么解决?相关的知识,希望对你有一定的参考价值。

Java新手,程序目的:将list中部分元素替换为指定的字符串str,我是将list截断为三个新的list即al1,al2,al3,将其中需要修改的al2部分使用Collections.fll方法替换为新的str,但是在将三个新的list添加回list时运行出错(编译通过),求大神看看。同时也希望指出,list的addAll方法使用时有哪些要注意的地方?

import java.util.*;

class CollectionsDemo

public static void main(String[] args)

List<String> list = new ArrayList<String>();

list.add("asafxx");
list.add("abcdsd");
list.add("dfx");
list.add("x");
list.add("ss");
list.add("x");

sop(list);

fillDemo(list,1,3,"pp");


public static void fillDemo(List<String> list,int start,int end,String str)

List<String> al1 = list.subList(0,start);
List<String> al2 = list.subList(start,end);
List<String> al3 = list.subList(end,list.size());

Collections.fill(al2,str);

list.clear();

list.addAll(al1);
list.addAll(al2);
list.addAll(al3);

sop(list);


public static void sop(Object obj)

System.out.println(obj);

list.clear(); // 这句话的含义是 清空list,而上面的al1~al3都是由list而来,故error

上面clear去掉,list重定向个对象,即可 list = new ArrayList<String>();
// new 生成的对象放在堆中,当list重定向之后,之前的那个对象依然存在,除非等到程序走完,gc会去清空堆中空间.故程序可运行.不知道这样的解释能不能看懂!

望知悉~追问

感谢!问题确实解决了,clear后的list只能添加不是由原list派生出来的元素及list吗?

参考技术A subList方法返回的List和原来的List共享数据
Returns a view of the portion of this list between the specified
fromIndex, inclusive, and toIndex, exclusive.追问

不好意思,可以说得稍微详细点儿吗?Java新手,见谅。

另外程序中该怎么解决呢?

Java的PriorityQueue构造函数调用和addAll方法的区别

【中文标题】Java的PriorityQueue构造函数调用和addAll方法的区别【英文标题】:Difference between Java's PriorityQueue constructor call and addAll method 【发布时间】:2019-05-18 18:28:13 【问题描述】:

我正在解决 leetcode 上的一个问题,有人告诉我,使用集合实例化 PriorityQueue 需要 O(n) 时间,而 addAll 方法需要 O(nlogn) 时间。它是否正确? 我找不到任何证据。

https://www.techiedelight.com/find-kth-largest-element-array/这个网站3号的做法是用addAll(List)来创建一个PriorityQueue真的是O(n)吗?

【问题讨论】:

我从未使用过优先级队列。你能描述一下它的算法吗? 【参考方案1】:

PriorityQueue 在 java 中从 AbstractQueue 获取 addAll 方法。 documentation 表示 addAll 方法只是遍历提供的集合。所以我会说 addAll 需要 O(n) 时间。如果您不相信,请查看the source code。

【讨论】:

以上是关于Java中使用addAll方法,抛出ConcurrentModificationException,请问问题出在哪儿?怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

如果元素是重复的,为什么Set.of()会抛出IllegalArgumentException?

Java的PriorityQueue构造函数调用和addAll方法的区别

java中ArrayList中的addAll方法有啥用?

JAVA中带有克隆方法的迭代器VS ArrayList.addAll()

java 集合和addAll()方法

Java:为啥 Collection.addAll 不能接受 Iterables?