在 ArrayList 中,如果我添加/删除项目,则这被视为“修改”列表。因此,如果我在尝试添加/删除项目的同时尝试迭代列表,我会得到ConcurrentModificationException
(除非我使用 listIterator)。
我的问题是,如果我执行如下操作:list.get(index).setValue("newValue"),是否仍会考虑修改列表?
在 ArrayList 中,如果我添加/删除项目,则这被视为“修改”列表。因此,如果我在尝试添加/删除项目的同时尝试迭代列表,我会得到ConcurrentModificationException
(除非我使用 listIterator)。
我的问题是,如果我执行如下操作:list.get(index).setValue("newValue"),是否仍会考虑修改列表?
否。编辑 List 中的项目不是“修改 List”:修改的是项目,而不是List。列表将不知道项目的任何更改。
只有对 List持有的项目引用的更改是对 List 的修改,即对List的插入和选择。
只有对列表内容(列表中有哪些对象)的更改才算作列表修改。更改列表中对象的内部状态不会更改列表修改计数器。
我认为,在病态的情况下,更改列表元素的内部状态可能会间接触发对列表本身的更改,这是一种副作用。我的第一段假设没有发生类似的事情。
这是基于equals
实现的替代答案ArrayList
,它通过equals
方法检查元素。因此,让我们考虑两个具有非不可变(可变)元素(另一个ArrayList
)的列表list1
和list2
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);
失败。
据此,修改列表的元素也会修改列表。