2012-12-27 69 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