簡體   English   中英

排序的ConcurrentModification異常

[英]ConcurrentModification Exception on Sorting

我寫了這個小程序來排序arrays 根據我的理解,它應該打印0,1,2

但是,當我運行此程序時,我收到ConcurrentModificationException

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

我真的不確定這個例外的根本原因。

有人可以幫我理解我犯錯的地方嗎?

注意:這個問題在JAVA 7上不存在,如果有人也說JAVA 8中的原因而不是JAVA 7那就太棒了

List.subList的API文檔說:

如果支持列表(即此列表)在結構上以除返回列表之外的任何方式進行修改,則此方法返回的列表的語義將變為未定義。 (結構修改是那些改變了這個列表的大小,或以其他方式擾亂它的方式,正在進行的迭代可能會產生不正確的結果 。)

排序確實會改變列表,使得正在進行的迭代會導致不正確的結果。 API文檔說在這種情況下發生的事情是未定義的 - 實際上這意味着拋出ConcurrentModificationException (至少在使用Java 8時),如代碼所示。

List.sublist返回列表的一部分視圖,因此您無法修改原始列表。 如果您希望它工作,那么您需要將子列表重寫為新的列表對象:

        List<Double> l1 = new ArrayList<>(Arrays.asList(2.0, 0.0, 1.0));
        List<Double> l2 = new ArrayList<>(l1.subList(0, 3));
        Collections.sort(l1);
        System.out.println(l2.get(0));

否則l2 vaues會在排序操作之后發生變化,這將是不必要的,並且java不允許它。

暫無
暫無

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

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