【问题标题】:avoiding concurrent modification exception with Map<Long,List<POJO>>使用 Map<Long,List<POJO>> 避免并发修改异常
【发布时间】:2013-10-15 17:19:53
【问题描述】:

我有数据结构Map&lt;Long,List&lt;POJO&gt;&gt;。我需要遍历地图并且对于每个列表,我需要将元素添加到列表中。例如,如果一个列表有 10 个元素,它最终可能有 12 个。我的问题是:如果我采用简单的方法来迭代地图并修改每个 List&lt;POJO&gt;,会导致并发修改异常吗?因为我不会明确更改每个列表的地址。我想一个子问题是,如果 List 需要一个更大的连续块来保存它的数组,它会改变它的地址吗?

【问题讨论】:

  • 我正在处理一个大问题,我正在考虑它。我只是希望专家能帮助我快速回答这个问题。
  • 您在尝试时遇到异常了吗?或者你试过了吗?

标签: java arraylist hashmap concurrentmodification


【解决方案1】:

您的两个问题的答案都是“否”:

  • 如果您所做的只是改变地图的值,则不会有ConcurrentModificationException,因为您实际上并没有改变值本身,只是改变了它们的状态。这很容易自己测试和确认。

  • 如果您尝试添加的元素超出列表的容量,列表将不会“更改其地址”。相反,更多的空间将在内部分配。例如,对于ArrayList,内部数组将被一个新的更大的数组替换,并且元素将被复制。

【讨论】:

  • 你的第二点似乎不同意@Batty。我倾向于接受你的回答,因为它突然似乎更有意义了。 +1。谢谢你的回答。
【解决方案2】:

如果您在迭代时尝试修改/添加到地图,则会出现异常,但在您的情况下,您正在迭代地图但添加到地图内的列表,所以不会有问题。 关于第二个问题,地址永远不会改变,但取决于实现,如果它是 ArrayList,并且在同一位置没有可用的附加空间,则创建新列表并复制元素,但情况并非总是如此。

【讨论】:

  • 好点+1。谢谢。你知道这如何影响更大的问题吗?
  • 说,ArrayList 初始大小为 5,一旦列表已满,第 6 个元素到来,JVM 将 List 的大小设为 10,如果 size = 10 在同一位置不可用,则新建 List创建并复制元素,但情况并非总是如此。
  • @Batty 后备数组会改变,而不是 ArrayList 本身。
【解决方案3】:

如果需要,此列表将更改其大小和内存位置。 ArrayLists 以其初始容量创建,然后在达到限制后加倍。如果没有连续的内存,地址将更改为不同的连续块来保存列表。但是,链表不会以这种方式分配。链表为节点分配空间,并且下一个引用被维护并作为对象的属性保存,因此不需要连续的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2013-02-10
    • 2016-11-19
    • 2012-02-03
    相关资源
    最近更新 更多