Arrays.copyOfRange と同じことを List(特に ArrayList)でやる方法 を、初心者向けに丁寧に説明します。
ポイントは Java の List が持つ subList() メソッド を使うことです。
subList() とは?
List の 一部分(範囲)だけを切り出すメソッドです。
配列の copyOfRange とほぼ同じ役割ですが、すこし挙動が違います。
基本構文
List<T> part = list.subList(from, to);
Javaルール
fromは 含む(inclusive)toは 含まない(exclusive)- 結果は 元リストのビュー(切り出した部分に対する「窓」)
→ 完全なコピーではない点が重要!
まずはシンプルな例
import java.util.*;
public class SubListBasic {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
List<Integer> part = list.subList(1, 4); // 1~3の要素
System.out.println(list); // [10, 20, 30, 40, 50]
System.out.println(part); // [20, 30, 40]
}
}
JavasubList の重要ポイント(配列との大きな違い)
① subList は コピーではなく“ビュー”
List の subList() は
**元リストの参照を共有している「切り出しビュー」**です。
つまり、subList 側の変更は元リストに反映されます!
実験例
List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50));
List<Integer> part = list.subList(1, 4);
part.set(0, 999);
System.out.println(list); // [10, 999, 30, 40, 50]
System.out.println(part); // [999, 30, 40]
Java→ part.set(0, 999) が list[1] にそのまま反映されています。
② subList に対して add/remove するときの注意
元リストを破壊する操作(削除・追加)をすると、subList が壊れます。
例:
list.add(999); // 元リストに追加
part.get(0); // → エラーになる可能性大(ConcurrentModificationException)
Javaリストの構造が変わると subList の内部状態が不一致になるためです。
③ 安全に “完全コピー” がほしいなら
ビューではなく 完全にコピーされた独立したリストが必要なときは:
List<Integer> copy = new ArrayList<>(list.subList(1, 4));
Javaこれが定番です。
→ これなら元リストを変えてもコピーに影響なし。
完全コピー例
List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50));
List<Integer> part = new ArrayList<>(list.subList(1, 4)); // 完全コピー
list.set(1, 999); // 元を変更
System.out.println(list); // [10, 999, 30, 40, 50]
System.out.println(part); // [20, 30, 40] ←影響なし
Java文字列でも同じ
List<String> names = Arrays.asList("Taro", "Hanako", "Yuki", "Sara");
List<String> part = names.subList(1, 3);
System.out.println(part); // [Hanako, Yuki]
よくある例外
❌ from > to
list.subList(3, 1); // → IllegalArgumentException
Java❌ from か to が範囲外
list.subList(-1, 3); // IndexOutOfBoundsException
list.subList(2, 999);
Javaまとめ(初心者が覚えるべきポイント)
| 機能 | Arrays.copyOfRange | List.subList |
|---|---|---|
| 結果の性質 | 完全コピー | ビュー(参照を共有) |
| 範囲 | from 含む、to 含まない | 同じ |
| 要素数 | to - from | 同じ |
| 安全性 | 元の配列と独立 | 元リスト変更で壊れやすい |
| コピーメソッド化 | 不要 | new ArrayList<>(subList) 推奨 |

