2012-12-27 19 views
2

由Maurice Naftalin,Philip Wadler研究Java泛型和集合書,我離開​​CopyOnWriteArraySet部分,在嘗試練習的同時學習使其堅持我的想法,但是我遇到了一個問題,讓我泄露我的瑣碎代碼:在修改CopyOnWriteArraySet時得到了UnsupportedOperationException

CopyOnWriteArrayList<Character> modifiableSet = new CopyOnWriteArrayList<Character>(); 
    modifiableSet.add('a');modifiableSet.add('d'); 
    for(Character ch:modifiableSet){ 
     if(ch.equals('d')){ 
     modifiableSet.remove(ch); // compiler neglects this, as expected, 
               // since CopyOnWriteArraySet is synchronous 
     }    
    } 

    for(Iterator<Character> its = modifiableSet.iterator();its.hasNext();){ 
    Character firstElement = its.next(); 
    if(firstElement.equals('a'))its.remove();// compiler does not give a damn here    
    // since CopyOnWriteArrayList is synchronous java.lang.UnsupportedOperationException 
    // surprisingly, wondering If CopyOnWriteArrayList is synchronous, 
// why the compiler shouts here ?       
} 

我我的大腦瞭解,到目前爲止,無論何時修改恰好CopyOnWriteArraySet,有了新的變化創造了一個新的支持數組,問題是,是否通過CopyOnWriteArraySet通過iterator()會發生在後盾陣列或前陣列,如果說前陣列很方便,這聽起來很合理CopyOnWriteArraySet.remove()在前面陣列上工作,而CopyOnWriteArraySet.iterator().remove()在後面陣列上工作,對不對?任何閃光燈投入這個遠遠讚賞,謝謝大家。

回答

3

CopyOnWriteArraySet API是它

•Iterators do not support the mutative remove operation. 

這是因爲CopyOnWriteArraySet的迭代器「的迭代器構建的時間依賴於陣列的快照不變」很清楚的。

+0

是有道理的,謝謝你清理那個。 – Rehme

+0

任何替代雖然? – Snicolas

相關問題