当前位置: 首页 > 面试题库 >

子列表抛出ConcurrentModificationException

乐正洲
2023-03-14
问题内容

我有非常简单的代码:

    List<String> list = new ArrayList<String>();
    String a = "a";
    String b = "b";
    String c = "c";
    String d = "d";

    list.add(a);
    list.add(b);
    list.add(c);

    List<String> backedList = list.subList(0, 2);
    list.add(0, d); 
    System.out.println("2b: " + backedList);

我通过list.add(0,d)得到ConcurrentModificationException异常。所以总的来说,这是因为sublist()造成的。我很困惑,因为在sublist()的情况下,文档中说:

返回列表由该列表支持,因此返回列表中的非结构性更改会反映在此列表中, 反之亦然

您能解释一下渔获量在哪里吗?


问题答案:

subList是原始列表的简单视图(请参阅此处)。您可以更改其中的元素,但不能更改列表的结构。

根据文档,subList如果您尝试进行结构更改,则行为是不确定的。我猜在这个特定的实现中,它ConcurrentModificationException被确定为不确定的行为。

如果后备列表(即,此列表)以非通过返回列表的方式进行了结构修改,则此方法返回的列表的语义将变得不确定。(结构修改是指更改此列表的大小的结构修改,或者以其他方式扰乱此列表的方式,使得正在进行的迭代可能会产生错误的结果。)



 类似资料:
  • 我编译了hadoop 2.2.0 x64并在集群上运行它。当我执行或时,它会像这样抛出一个NPE: 在hadoop webapp上,比如job历史(我打开job历史服务器)。它显示没有作业正在运行,也没有作业完成,尽管我正在运行作业。 请帮我解决这个问题。

  • 问题内容: 每次我运行该程序时,都会出现以下错误: 每当有人被螺栓击中时,我都试图降低其健康状况。如果一个外星人的健康状况良好,也应该予以销毁。同样,螺栓也会被破坏。这是我的代码: 在上线情况。为了澄清,和都是字典列表。 我究竟做错了什么? 问题答案: 您不应从正在循环的列表中删除项目。而是创建一个副本: 和 循环访问列表时修改列表会影响循环: 从要遍历两次的列表中删除项目会使事情变得更加复杂,从

  • 问题内容: 我打印出列表的内容,并得到以下输出: 这些奇怪的点是什么? 我用的是python 2.7.3 问题答案: 可能是您不小心建立了一个列表,其中包含对自身的引用(或此处有很多引用): 使用三个点使字符串表示不会在递归中淹没。您可以使用和运算符进行验证:

  • 问题内容: 我有一个集合和一个数组。我试图将数组转换为集合c2并执行操作,但这会抛出异常。我发现,类收益类和这个类继承自其实现抛出。 有什么办法可以删除元素?请帮忙 问题答案: 返回数组的包装器。此包装具有固定的大小,并直接由数组支持,因此对的调用将修改数组,而修改列表的任何其他方法都将引发。 要解决此问题,你必须通过复制包装器列表的内容来创建新的可修改列表。通过使用ArrayList带有的构造函

  • CDC表的列数少于源表。当debezium试图在Kafka中创建一个事件时,它失败了: ArrayIndexOutOfBounds异常。 历史主题包含完整源表架构的快照。这是否是debezium的一个限制,即CDC模式不能与源模式不同?

  • 嗨,我的数据结构已附加。 我只需要访问下每个元素下的。我可以单独手动执行,这给了我,但像这样的元素有100个。 我遵循这个问题的解决方案:列表子集的子集 使用此