フェイル・ファースト・イテレータを使用してコレクションを反復している間にスレッドがコレクションを直接変更した場合、イテレータはこの例外をスローします。 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の例について:「私は以下のコードを実行するとうまくいくが、あなたのコードはうまくいかないが、それは非常にうんざりだ。索引付きfor-loop内で要素を追加/削除すると、いくつかの要素をスキップしたり、他の要素を2回処理したりします。コレクションを変更したときにイテレータが例外をスローするのは良いことです。 – toto2