[英]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.