2017-04-24 66 views
-1

我寫了一個程序,這是投擲ConcurrentUpdateException,我無法理解這種行爲,它不應該通過任何異常,因爲我只有單線程工作,我沒有采取任何迭代器。排序後需要了解ConcurrentUpdateException嗎?

發生了什麼,排序?爲什麼它拋出這個異常?請解釋。

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

public class Test { 
     public static void main(String[] args) { 
     List<Double> list1 = new ArrayList<Double>(Arrays.asList(3., 2., 0., 1., 2.)); 
     List<Double> subList = list1.subList(0, 3); 
     Collections.sort(list1); 
     System.out.println(subList.get(0)); 

    } 
} 
+0

你可以添加堆棧跟蹤嗎?什麼是「3.,2.,0.,1.,2.」? –

+0

當我在本地執行代碼時,沒有例外。它只輸出'0.0' – SomeJavaGuy

+1

正如@Sergey指出的那樣,subList()返回一個由原始列表支持的視圖。對原始列表進行任何結構更改都會使視圖未定義(例如,如果您希望子列表中原始列表的元素0到3,並且對原始列表進行排序,那麼元素將不再是原來的元素請求)。 ConcurrentUpdateException有點誤導,因爲它似乎表明一個多線程問題。相反,當對父列表進行修改的顯式測試是肯定的時,它會被拋出。 –

回答

0

功能subList返回此列表內的指定範圍的圖。所以當你對collection進行排序時,subList也會改變。這就是爲什麼你得到0.0,而不是3.0