Javaのforループ削除収集トラップ

高洛峰
リリース: 2017-01-16 15:46:41
オリジナル
1587 人が閲覧しました

まず以下のコードを見てください:

import java.util.LinkedList;
import java.util.List;
 
public class DeleteCollection {
   
  public static void main(String[] args) {
    List<String> list = new LinkedList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    for(int i=0;i<list.size();i++){ //循环删除集合中的元素
      list.remove(i);
    }
    System.out.println("还剩余的元素个数:"+list.size());
  }
}
ログイン後にコピー

上記のコードはアイデアに従って正しいはずであり、出力結果も0になるはずです

以下の実際の出力結果を見てください:

残りの要素の数: 2

なぜなのかと疑問に思うかもしれません。コレクションのサイズは動的に変化するため、要素を削除すると、要素内のシリアル番号が再配置され、削除されるべき 2 番目の要素が最初の要素の位置に配置されますが、実際には 3 番目の要素が削除されます。元の削除されたコードにステートメントを追加すると、要素が 1 番目、3 番目、5 番目、などのようになります。 System.out.println("削除される要素: "+list. get(i));確認することができます。

上記の文を追加した後の出力結果:

削除する要素: a
削除する要素: c
削除する要素: e
残りの要素の数: 2

解決策:

原因を調べる理由は、削除したい要素が前に移動したにもかかわらず、i で保存した値が後ろに移動したままであるためです。したがって、i が前に移動するのを防ぎ、1 つ前に移動すれば、要素を削除できます。 2 番目にランク付けされていた要素が 1 番目にランク付けされました。

変更後のコアコード:

for(int i=0;i<list.size();i++){
    System.out.println("即将删除的元素:"+list.get(i));
    list.remove(i);
    i--;
  }
ログイン後にコピー

結果:

削除される要素: a
削除される要素:b
削除される要素:c
削除される要素:d
削除される要素: e
の残りの要素の数: 0

以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

Java の for ループ削除収集トラップに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート