Javaサブリストがリストのインスタンスを返さず、リストのビューを返すという問題に遭遇しました。その結果、スレッドがスタックしました。
私はグーグルをして、これを見つけました。
はい、List.subList
文書化されているように、ビューを返します:
指定された fromIndex (これを含む) と toIndex (これを含まない) の間のこのリストの部分のビューを返します。(fromIndex と toIndex が等しい場合、返されるリストは空です。) 返されるリストはこのリストに基づいているため、返されるリストの非構造的な変更はこのリストに反映され、その逆も同様です。返されたリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートしています。
そして、はい、ビューのビューにビューを作成することは...悪い考えになる可能性があります。
ただし、この話の教訓は「使用しない」ではなく、subList
「呼び出しているメソッドが何をすべきかを確認し、ドキュメントを読む」ことです。
ほぼ 8 年前のスレッドです。それでも、私の答えが誰かを助けるかもしれないと信じています。
上記の Jon Skeet が述べたように、subList
常に元のリストへの参照を返します。これに対する簡単な修正は、それを新しい ArrayList<> に割り当てることです
例:
List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);
x.add(3);
x.add(4);
x.add(5);
List<Integer> y = new ArrayList<Integer>(x.subList(0, 4));