日によると、
「Iterator.remove は、反復中にコレクションを変更する唯一の安全な方法です。反復の進行中に基になるコレクションが他の方法で変更された場合、動作は規定されていません。」
2 つの質問があります。
- この操作「Iterator.remove()」が他の操作よりも安定しているのはなぜですか?
- ほとんどのユースケースで役に立たないのに、なぜ「Collection.remove()」メソッドを提供したのですか?
日によると、
「Iterator.remove は、反復中にコレクションを変更する唯一の安全な方法です。反復の進行中に基になるコレクションが他の方法で変更された場合、動作は規定されていません。」
2 つの質問があります。
まず、Collection.remove()
非常に便利です。多くのユースケースに適用できますが、おそらくIterator.remove()
.
ただし、後者は 1 つの特定の問題を解決します: コレクションを反復処理しながらコレクションを変更できます。
によって解決される問題をIterator.remove()
以下に示します。
List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
for (int el : l) {
if (el < 3) {
l.remove(el);
}
}
l.remove()
の反復中に が呼び出されるため、このコードは無効l
です。
正しい書き方は次のとおりです。
Iterator<Integer> it = l.iterator();
while (it.hasNext()) {
int el = it.next();
if (el < 3) {
it.remove();
}
}
コレクションを反復処理して使用する場合:
Collection.remove()
ループを完了するために必要な明示的な一連の呼び出しを構築するために以前に使用されたオブジェクトの状態を変更しているため、実行時エラー (具体的には ConcurrentModifcationException) が発生する可能性があります。
使用する場合:
Iterator.remove()
基になるコレクションを変更し、ループを完了するために必要な一連の明示的な呼び出しを再評価することをランタイムに伝えます。
あなたが引用したドキュメントが明確に述べているように、
Iterator.remove は、反復中にコレクションを変更する唯一の安全な方法です
(強調追加)
am iterator を使用している間は、 を呼び出す場合を除き、コレクションを変更できませんIterator.remove()
。
コレクションを繰り返していない場合は、Collection.remove()
.
この操作「Iterator.remove()」が他の操作よりも安定しているのはなぜですか?
これは、反復子が要素を削除したことを認識しているため、ConcurrentModifcationException を生成しないことを意味します。
ほとんどのユースケースで役に立たないのに、なぜ「Collection.remove()」メソッドを提供したのですか?
通常は Map.remove() または Collection.remove() を使用します。これは、すべてのオブジェクトを反復するよりもはるかに効率的です。頻繁に繰り返しながら削除している場合は、別のコレクションを使用する必要があると思います。
私が理解していることから、Collection.remove(int index) は削除されたオブジェクトも返します。Iterative.remove() はしません。
単なるデザインの選択です。別の動作を指定することも可能でした (つまり、反復子は Collection.remove() によって削除された値をスキップする必要があります) が、コレクション フレームワークの実装がはるかに複雑になります。したがって、未指定のままにするという選択。
とても便利です。削除したいオブジェクトがわかっている場合、なぜ反復する必要があるのでしょうか?