5

subList メソッドを使用して新しい ArrayList を作成しました。今、retainAll を使用して交差操作を実行しようとすると、次の例外がスローされます

keepAll() メソッドは以下のコードで機能します

List<Integer> arrNums1 = new ArrayList<Integer>();
arrNums1.add(1);
arrNums1.add(2);
arrNums1.add(3);

List<Integer> arrNums2 = arrNums1.subList(0, 1);
arrNums2.retainAll(arrNums1);

しかし、以下のコードにretainAllを適用しようとすると、以下のように例外が生成されます

Java コード

public class Generics1
{   
 public static void main(String[] args)
 {
       List<Fruits> arrFruits = new ArrayList<Fruits>();

        Fruits objApple  = new Apple();
        Fruits objOrange = new Orange();
        Fruits objMango  = new Mango();

        arrFruits.add(objApple);
        arrFruits.add(objOrange);
        arrFruits.add(objMango);

        List<Fruits> arrNewFruits = arrFruits.subList(0, 1);

        System.out.println(arrFruits.retainAll(arrNewFruits));
  }
}

class Fruits {}

class Apple extends Fruits {}

class Orange extends Fruits {}

class Mango extends Fruits {}

エラー

ここに画像の説明を入力

4

3 に答える 3

8

List#subList()を使用する場合:

指定された fromIndex (これを含む) と toIndex (これを含まない) の間のこのリストの部分のビューを返します。(fromIndex と toIndex が等しい場合、返されるリストは空です。) 返されるリストはこのリストに基づいているため、返されるリストの非構造的な変更はこのリストに反映され、その逆も同様です。返されたリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートしています。

その中の要素を変更することはできますが、リストの構造を変更することはできません。

ドキュメントはさらに次のように述べています。

バッキング リスト (つまり、このリスト) が返されたリスト以外の方法で構造的に変更された場合、このメソッドによって返されるリストのセマンティクスは未定義になります。(構造的な変更とは、このリストのサイズを変更するもの、または進行中の反復が誤った結果をもたらす可能性があるような方法でそれを混乱させるものです。)

このretainAll()関数は、反復子を使用して交差しない値を削除します。これにより、ConcurrentModificationException. ドキュメントの内容に注意してください:

この例外は、オブジェクトが別のスレッドによって同時に変更されたことを常に示すわけではないことに注意してください。1 つのスレッドが、オブジェクトのコントラクトに違反する一連のメソッド呼び出しを発行すると、オブジェクトはこの例外をスローする可能性があります。

のコピーを作成してListから実行しますretainAll()

List<Fruits> arrNewFruits = new ArrayList<>(arrFruits.subList(0, 1));
于 2013-07-10T07:09:32.120 に答える
2

問題は、それarrNewFruitsが実際には の一部の論理ビューにすぎないことですarrFruits1エラーを回避するには、独立したリストを作成する必要があります。

List<Fruits> arrNewFruits = new ArrayList<>(arrFruits.subList(0, 1));

1clear()を呼び出してリストの一部を削除できるのはそのためですsubList()

于 2013-07-10T07:13:15.180 に答える