2013-08-25 91 views
1

在ArrayList中,如果我添加/刪除項目,那麼這被認爲是「修改」列表。因此,如果我嘗試迭代列表,同時嘗試添加/刪除項目,我得到ConcurrentModificationException(除非我使用listIterator)。我的問題是,如果我做了如下操作:list.get(index).setValue(「newValue」),它仍然被認爲是修改列表嗎?編輯列表中的項目作爲修改列表嗎?

+0

只是一個方面,你可以通過使用'CopyOnWriteArrayList'來避免'ConcurrentModificationException'。 –

回答

4

編輯列表中的項目不是「修改列表」:項目被修改,而不是列表。該列表將不知道對這些項目的任何更改。

只有到項目更改引用通過舉行名單是對列表,即修改從列表中插入和選擇來/。

+0

這可能是真的,但我認爲它與'ArrayList'的equals實現相矛盾,它使用'equals'而不是'=='檢查元素相等性 – Katona

3

只對列表內容(列表中的哪些對象)進行更改將被視爲列表修改。對列表中對象的內部狀態的更改不會更改列表修改計數器。

在病理情況下,我想,改變列表元素的內部狀態可能會間接地觸發列表本身的變化,作爲副作用。我的第一段假設沒有這樣的事情發生。

0

這是一個替代答案,基於equals實現ArrayList,它通過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); 

失敗。

據此,修改列表的元素也會修改列表。

+0

謝謝。但是我從併發修改概念的視角提出要求 – Victor