【问题标题】:Does editing an item in an arraylist count as modifying the list?编辑数组列表中的项目是否算作修改列表?
【发布时间】:2013-08-25 21:54:20
【问题描述】:

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

我的问题是,如果我做这样的操作:list.get(index).setValue("newValue"),是否仍然考虑修改列表?

【问题讨论】:

  • 只是一个旁注,你可以通过使用CopyOnWriteArrayList来避免ConcurrentModificationException

标签: java arraylist concurrentmodification


【解决方案1】:

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

只有对 references 项目的更改由 列表是对 列表 的修改,即插入和选择到/从列表.

【讨论】:

  • 这可能是真的,但我认为这与ArrayListequals 实现相矛盾,后者使用equals 而不是== 检查元素相等性
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是基于ArrayListequals 实现的替代答案,它通过equals 方法检查元素。所以,让我们考虑两个具有非不可变(可变)元素的列表(另一个ArrayListlist1list2

        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);
    

    失败。

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

    【讨论】:

    • 谢谢。但我是从并发修改异常的 POV 中询问的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2015-07-17
    相关资源
    最近更新 更多