2

モーリス・ナフタリン、フィリップ・ワドラーによる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

CopyOnWriteArraySetAPIはそれについて非常に明確です

•Iterators do not support the mutative remove operation. 

これは、CopyOnWriteArraySetのイテレータが「イテレータの構築時に配列の変更されていないスナップショットに依存している」ためです。

于 2012-12-27T06:40:34.653 に答える