编辑arraylist中的项目是否会计入修改列表?

时间:2013-08-25 21:54:21

标签: java arraylist concurrentmodification

在ArrayList中,如果我添加/删除项目,则认为这是“修改”列表。因此,如果我尝试迭代列表同时尝试添加/删除项目,我得到ConcurrentModificationException(除非我使用listIterator)。

我的问题是,如果我执行类似:list.get(index).setValue(“newValue”)的操作,是否还在考虑修改列表?

3 个答案:

答案 0 :(得分:4)

没有。编辑列表中的项目不是“修改列表”:被修改,而不是列表。列表将不知道对项目的任何更改。

只有 列表的更改才会对列表进行修改,即对列表进行插入和选择

答案 1 :(得分:3)

仅对列表内容的更改(列表中的对象)将计为列表修改。对列表中对象的内部状态的更改不会更改列表修改计数器。

在病态情况下,我认为,更改列表元素的内部状态可能会间接触发对列表本身的更改作为副作用。我的第一段假设没有这样的事情发生。

答案 2 :(得分:0)

这是基于equals ArrayList实现的替代答案,equalsArrayList方法检查元素。所以,让我们考虑两个包含非不可变(可变)元素的列表(另一个list1list2 List<String> mutableElement1 = new ArrayList<String>(); ArrayList<List<String>> list1 = new ArrayList<List<String>>(); list1.add(mutableElement1); List<String> mutableElement2 = new ArrayList<String>(); ArrayList<List<String>> list2 = new ArrayList<List<String>>(); list2.add(mutableElement2);

    assertEquals(list1, list2);

此时它们包含相同顺序的相同元素,所以

    mutableElement1.add("element");

通过。然后,我更改了第一个列表的元素:

    assertEquals(list1, list2);

然后

{{1}}

失败。

根据这一点,修改列表的元素也会修改列表。