修改CopyOnWriteArraySet时出现UnsupportedOperationException

时间:2012-12-27 06:18:07

标签: java collections synchronization set copy-on-write

由Maurice Naftalin,Philip Wadler研究Java Generics and Collection书籍,我在CopyOnWriteArraySet部分离开了,在学习的同时尝试练习使它坚持我的想法,但我遇到了一个问题,让我揭示我的琐碎代码: / p>

  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发生修改时,使用新更改创建的新支持数组,问题是,是否经过CopyOnWriteArraySetiterator()发生在支持阵列或前阵列上,如果说前阵列很方便,我认为CopyOnWriteArraySet.remove()在前阵列上工作是合理的,而CopyOnWriteArraySet.iterator().remove()适用于后备阵列,我是对的吗?

任何闪光灯都非常感谢,谢谢大家。

1 个答案:

答案 0 :(得分:3)

CopyOnWriteArraySet API非常清楚

•Iterators do not support the mutative remove operation. 

这是因为CopyOnWriteArraySet的迭代器“在构造迭代器时依赖于数组的不变快照”。