1

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

4

3 回答 3

3

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

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

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

于 2013-10-15T17:23:33.413 回答
2

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

于 2013-10-15T17:22:32.320 回答
0

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

于 2013-10-15T17:36:45.347 回答