Java | Arrays.copyOfRange と同じことを List(特に ArrayList)でやる方法

Java Java
スポンサーリンク

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]
    }
}
Java

subList の重要ポイント(配列との大きな違い)

① 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.copyOfRangeList.subList
結果の性質完全コピービュー(参照を共有)
範囲from 含む、to 含まない同じ
要素数to - from同じ
安全性元の配列と独立元リスト変更で壊れやすい
コピーメソッド化不要new ArrayList<>(subList) 推奨

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました