理由?
ArrayListによって返されるイテレータは本質fail-fast
的です。
このクラスの反復子とlistIterator
メソッドによって返される反復子はfail-fas
次のとおりです。反復子の作成後にリストが構造的に変更された場合、反復子自体の remove メソッドまたは add メソッド以外の方法で、反復子はConcurrentModificationException
. したがって、同時変更に直面した場合、反復子は、将来の不確定な時点で恣意的で非決定論的な動作を危険にさらすのではなく、迅速かつ明確に失敗します。
この反復子は、使用していないときにどこから来るのですか?
コレクションの強化された for ループIterator
が使用されるため、反復中に remove メソッドを呼び出すことはできません。
したがって、ループは以下と同じです
for (Iterator<word> i = c.iterator(); i.hasNext(); ){
解決策は何ですか?
iterator.remove();
暗黙的ではなく明示的に反復子に基づいてループを呼び出して変更できます。
String inputWord = "john";
ArrayList<String> wordlist = new ArrayList<String>();
wordlist.add("rambo");
wordlist.add("john");
for (ListIterator<String> iterator = wordlist.listIterator(); iterator
.hasNext();) {
String z = iterator.next();
if (z.equals(inputWord)) {
iterator.remove();
System.out.println("the word" + inputWord + "is removed");
}
}
System.out.println(wordlist.size());
どこでもっと読むことができますか?
- For-Each ループ
- ArrayList Java ドキュメント