3
從TreeSet
(一SortedSet
)在Java中8:SortedSet :: removeAll(headSet)失敗,但從headSet派生另一個集合成功。爲什麼?
- 我稱之爲
::headSet
方法在排序集合的前面,以獲得對象的SortedSet
。 - 我打電話給
::removeAll
刪除那些最前面的對象。
BAM,拋出一個ConcurrentModificationException
。
然而,如果我從headSet製作另一個SortedSet並將派生集合傳遞給::removeAll
,沒有問題。
爲什麼?
使用Java 8更新的演示代碼45.啓用行//sortedSet.removeAll(headSet);
以查看引發的異常。
String cockatiel = "Cockatiel";
SortedSet sortedSet = new TreeSet<String>();
sortedSet.add("Dog");
sortedSet.add("Cat");
sortedSet.add("Bird");
sortedSet.add("Elephant");
sortedSet.add(cockatiel); // Passing var rather than literal.
sortedSet.add("Guppy");
System.out.println("Before: " + sortedSet);
// Direct way. FAIL
SortedSet<String> headSet = sortedSet.headSet(cockatiel);
System.out.println("headSet: " + headSet);
//sortedSet.removeAll(headSet); // Fails. Throws java.util.ConcurrentModificationException.
// Derived way. PASS
SortedSet<String> headSetDerived = new TreeSet<String>(headSet); // Make a TreeSet from a TreeSet.
sortedSet.removeAll(headSetDerived); // Succeeds. Why?
System.out.println("After: " + sortedSet);
我沒有意識到headSet是由原始Set支持的。我現在在文檔中看到。這解釋了這種行爲,其中第一次刪除成功,而進一步刪除引發異常。謝謝。 –