我有数据结构Map<Long,List<POJO>>
。我需要迭代地图,对于每个List,我需要向列表中添加元素。因此,例如,如果一个列表有10个元素,它可能会以12结尾。我的问题:如果我采用一种简单的迭代地图并修改每个List<POJO>
的方法,会导致并发修改异常吗?因为我不会明确地更改每个List的地址。我猜一个子问题是,如果需要一个更大的连续块来保存其数组,List是否会更改其地址。
答案 0 :(得分:3)
你的两个问题的答案都是“不”:
如果您所做的只是改变地图的值,那么就没有ConcurrentModificationException
,因为您实际上并没有更改值,只是更改了州。这很容易测试和确认。
如果您尝试添加的元素超出其容纳范围,则列表不会“更改其地址”。相反,将在内部分配更多空间。例如,对于ArrayList
,内部数组将被更大的新数组替换,元素将被复制。
答案 1 :(得分:2)
如果您尝试在迭代时修改/添加到地图,则会出现异常,但在您的情况下,您正在迭代地图但在地图中添加到List,因此不会出现问题。 关于第二个问题,Address永远不会改变,但取决于实现,比如它是否是ArrayList,并且在相同位置没有可用的额外空间,那么就会创建新的List并复制元素,但事实并非如此。
答案 2 :(得分:0)
如果需要,此列表将更改其大小和内存位置。使用初始容量创建ArrayLists,然后在达到限制时加倍。如果没有连续的内存,则地址将更改为不同的连续块以保存列表。但是,链接列表不会以这种方式分配。链表为节点分配空间,下一个引用被维护并保存为对象的属性,因此不需要连续的内存。