2

学习由 Maurice Naftalin、Philip Wadler 撰写的 Java Generics and Collection 书,我在 CopyOnWriteArraySet 部分停止,在学习时尝试练习以使其牢记在心,但是我遇到了一个问题,让我透露一下我的琐碎代码:

  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()适用于后阵列,对吗?

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

4

1 回答 1

3

CopyOnWriteArraySet API 说得很清楚

•Iterators do not support the mutative remove operation. 

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

于 2012-12-27T06:40:34.653 回答