簡體   English   中英

ConcurrentModificationException 使用列表迭代器 java 刪除元素時

[英]ConcurrentModificationException When removing element using list iterator java

即使使用迭代器,我在刪除列表的第一個和第二個元素時也遇到問題。

我已閱讀以下線程,但無法解決我的問題(那些是最相關的,但我也檢查了其他材料):

嘗試從列表中刪除元素時出現 ConcurrentModificationException

遍歷集合,在循環中刪除對象時避免 ConcurrentModificationException

所以我的代碼看起來像這樣:

List<List<String>> list = cnf.read();
List<List<String>> nlist = new ArrayList<>();
for (List<String> l : list) {
    if (l.size() <= 3) {
        nlist.add(l);
    } else {
        int size = l.size();
        while (size > 3) {
            List<String> three = l.subList(0, 2);
            three.add("Y" + (count++));
            //Iterator itr = l.iterator();
            ListIterator itr = l.listIterator();
            int v = 0;
            while (itr.hasNext()) {
                itr.next();
                if (v == 0 || v == 1) {
                    itr.remove();
                    v++;
                }
            }
            l.add(0, "Y" + (count++));
            size--;
            nlist.add(three);
        }
        nlist.add(l);
    }
}
for (List<String> l : nlist) {
    System.out.println(l.toString());
    System.out.println(l.size());
}

我在此處的打印語句中收到 ConcurrentModificationException :

System.out.println(l.toString());

我也嘗試在我的 2 個 for 循環中使用迭代器,但似乎沒什么區別! 我是發布問題的新手,所以如果我做對了,請告訴我! 謝謝你。

經過長時間的調試,這里是解決方案。

sublist 函數通過引用而不是通過值傳遞,由 ArrayList.subList 調用創建的子列表保留對原始列表的引用並直接訪問其 elementData 數組。

出於這個原因,當向“三”列表添加一個元素時,我們改變了原始列表的狀態。 這發生在這里:

三.add("Y" + (count++));

針對這種特定情況修復它的一種方法是通過以下方式創建和初始化“三個”列表:

                String one = l.get(0);
                String two = l.get(1);
                List<String> three = new ArrayList<>();
                three.add(one);
                three.add(two);
                three.add("Y" + (count));

這允許我們在不獲得並發異常 (ConcurrentModificationException) 的情況下操作我們的列表。 但是,如果您要操作大列表,我建議您使用另一種不太硬編碼的方法來創建列表。

我會將這個帖子標記為已回答,希望對人們有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM