2011-09-10 18 views
8

フェイル・ファースト・イテレータを使用してコレクションを反復している間にスレッドがコレクションを直接変更した場合、イテレータはこの例外をスローします。 http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html反復中にコレクション内の要素を変更する概念

は私が並行変更をしても、コード

List<Employee> lista= new ArrayList(); 
Employee emp1=new Employee(); 
Employee emp2=new Employee(); 
Employee emp3=new Employee(); 
lista.add(emp1); 
lista.add(emp2); 
lista.add(emp3); 
for(Employee emp:lista) 
{ 
emp2.setEmpId(2); 
lista.remove(emp2); 
} 

Question1の下でスローされた: - ので、私はそれが動作するコードの下に実行したときにも、内部けれどもがフェイルファスト反復子を使用してforループを強化すると言うことができますか?細かい

for(int i=0;i<lista.size();i++) 
{ 
Employee empTemp=lista.get(i); 
lista.remove(emp2);   
} 

Question2: - 文が

を言うときには、別の質問です

スレッドがコレクション

を変更する場合は私の推測では、それはまた、設定されたインターフェイスのための要素の修正が含まれている間変更がここにリストインターフェイスのためではない、コレクション内の要素の更新のための除去又は付加を意味します。右?少なくとも私が試したプログラムは、彼らの場合です。

編集

セットに関しては、我々はiterating.Iはコードの下にしようとしたが、それはすべての例外に

HashSet<Employee> set1= new HashSet(); 
Employee emp4=new Employee(); 
Employee emp5=new Employee(); 
Employee emp6=new Employee(); 
set1.add(emp4); 
set1.add(emp5); 
set1.add(emp6); 


Iterator iter1=set1.iterator(); 
while(iter1.hasNext()) 
{ 
Employee emp12=(Employee)iter1.next(); 
System.out.println(""); 
emp5.setEmpId(2); 

} 
をスローしなかった設定変更しようとすると、それは同時変更例外がスローされます。すなわち、私は上記のステートメントを疑います

http://download.oracle.com/javase/6/docs/api/java/util/HashSet.htmlでイテレータが作成された後でいつでもセットが変更されているのであれば、それは同時の変更例外をスローする必要がありますが、そうしないのが理想的です。理由は分かりませんか?

+1

質問1の例について:「私は以下のコードを実行するとうまくいくが、あなたのコードはうまくいかないが、それは非常にうんざりだ。索引付きfor-loop内で要素を追加/削除すると、いくつかの要素をスキップしたり、他の要素を2回処理したりします。コレクションを変更したときにイテレータが例外をスローするのは良いことです。 – toto2

答えて

11

はQuestion1: - ?私はコードの下に実行したときに私が言うことができるループのための強化も内部でフェイルファスト反復子を使用していますけれども、それは

はい、右thatsの罰金に動作します。コンパイルされたコードを見て、javapコマンドで確認してください。

私の推測では、それはまた、設定されたインターフェイスのための要素の修正が含まれている間は、変更リストインタフェースのためのコレクション内の要素のupdationため、ここで除去または追加を意味しないということです。右?少なくとも私が試したプログラムは、それらのケースです。右ザッツ

あなたがemp1.setEmpId(2)または類似した何かをすれば、反復は失敗しません。

...同時変更例外がスローされるはずですが、そうではありません。理由は分かりませんか?

あなたはリストを変更する場合には、唯一の例外がスローされます。リストにはオブジェクトへの参照が含まれています。オブジェクトを変更すると、参照は変更されないため、リストは変更されません。

+0

こんにちはaioobeあなたも編集部分を見ることができますか? –

+0

私の答えを明確にしました。 – aioobe

2

2つの異なるスレッドがアクセスしない限り、リスト内の要素を変更する危険はありません。あなたのforはconcurrent modification exceptionを投げておらず、セット自体ではなく、セットの要素を変更しているからです。

関連する問題