1

このプログラムを作成しました。

    List<Integer> l = new ArrayList<>();
    l.add(1);
    l.add(5);
    l.add(112);

    Iterator i = l.iterator();      
    while(i.hasNext())
    {
        System.out.println(i.next());

    }
    Iterator ii = l.iterator();

    while(ii.hasNext())
    {
        System.out.println(ii.next());

    }

このプログラムをデバッグで実行しているとき。

デバッグ ポイントは onIterator i = l.iterator(); です。

この時点で、Eclipse の [変数] タブに移動して、リストに整数を追加しました。

追加しましInteger.valueof(34);た。

このプログラムを完全に実行すると、印刷されます

1
5
112
1
5
112

2 番目のイテレータが印刷されない理由34ConcurrentModificationExceptionそして、それは私に例外を与えません。

ありがとう。

4

2 に答える 2

5

l.elementData[3]からに直接変更しnullているようですInteger。クラスの内部を直接いじっているので、一貫性がなく、その契約に従って動作し続けることは保証されていません。

私の実装では、要素を追加するには変更も必要l.sizeです。l.modCountフェイルファスト メカニズムは、インクリメントする必要がある に依存しています。

つまり、手動で模倣するArrayList.add()には、実装のソース コードを調べて、実際の実装で行われるすべての手順を実行する必要があります。

于 2013-06-30T07:01:41.907 に答える
0

ConcurrentModificationExceptions はフェイルファストです。したがって、それらはベスト エフォート ベースです。基本的にすぐに吐く保証はありません。

于 2013-06-30T06:58:53.690 に答える