1

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

我的问题是,如果我执行如下操作:list.get(index).setValue("newValue"),是否仍会考虑修改列表?

4

3 回答 3

4

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

只有对 List持有的项目引用的更改是对 List 的修改,即对List的插入和选择。

于 2013-08-25T21:57:24.717 回答
3

只有对列表内容(列表中有哪些对象)的更改才算作列表修改。更改列表中对象的内部状态不会更改列表修改计数器。

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

于 2013-08-25T21:55:23.427 回答
0

这是基于equals实现的替代答案ArrayList,它通过equals方法检查元素。因此,让我们考虑两个具有非不可变(可变)元素(另一个ArrayList)的列表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);

失败。

据此,修改列表的元素也会修改列表。

于 2013-08-25T23:15:38.453 回答