爲什麼這段代碼不能輸入ConcurrentModificationException
?它在修改Collection
的同時迭代遍歷它,而不使用Iterator.remove()
方法,它的意思是the only safe way of removing。爲什麼此代碼不會引發ConcurrentModificationException?
List<String> strings = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String string : strings)
if ("B".equals(string))
strings.remove("B");
System.out.println(strings);
我得到同樣的結果,如果我有一個LinkedList
更換ArrayList
。但是,如果我將列表更改爲("A", "B", "C", "D)
或只是("A", "B")
,我會按預期得到異常。到底是怎麼回事?如果這是相關的,我正在使用jdk1.8.0_25
。
編輯
我發現下面的鏈接
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4902078
相關的部分是
天真的解決方案是商品化檢查添加到hasNext在AbstractList中,但這樣做會使檢查的成本增加一倍。 事實證明,僅在最後一次迭代中進行測試就足夠了,這樣做幾乎不會增加成本。換句話說, 當前實現hasNext的:
public boolean hasNext() { return nextIndex() < size; }
由該實施方案替換:
public boolean hasNext() { if (cursor != size()) return true; checkForComodification(); return false; }
這種變化將不能進行,因爲太陽內部監管機構拒絕了。正式的裁決表明,該變更「具有 」表明對現有代碼具有顯着兼容性影響 的潛力。「 (其中「兼容性影響」是修復具有 與 ConcurrentModificationException的更換無聲的不當行爲的潛力。)
因爲'ConcurrentModificationException'被套上一個「盡力而爲」的基礎上 –
可能重複:預期時java.util.ConcurrentModificationException沒有拋出(http://stackoverflow.com/questions/ 24980651/java-util-concurrentmodificationexception -with-thrown-when-expected) – Pshemo
我喜歡Sun沒有做出改變的原因是它可能會讓一些不好的代碼實際上開始拋出它應該拋出的異常 – Mshnik