MEDIA

メディア

  1. TOP
  2. メディア
  3. プログラミング
  4. Java List完全ガイド|ArrayListとLinkedListの使い分けまで徹底解説

Java List完全ガイド|ArrayListとLinkedListの使い分けまで徹底解説

Javaの開発において、最も頻繁に使用されるデータ構造のひとつがListです。

配列より柔軟に扱え、追加・削除・検索が容易なため、実務でも必須スキルとなります。

しかし、学習初期には次のような疑問を持つ人が多いです。

  • 配列とListは何が違うの?
  • ArrayListとLinkedListはどちらを使うべき?
  • removeやaddでエラーが出る理由が分からない
  • 実務ではどのように設計するの?

この記事では、Listの基本から実務レベルの設計ポイントまでを体系的に解説します。

未経験からエンジニアを目指す方でも理解できるよう、具体コード例を交えて説明していきます。

Listとは?特徴と使われる場面

Listの基本的な特徴

Listは順序を保持したまま要素を管理できるコレクションです。

List<String> names = new ArrayList<>();
names.add("Taro");
names.add("Hanako");
System.out.println(names.get(0)); // Taro

主な特徴

  • 順序が保持される
  • インデックスでアクセス可能
  • 重複要素を許可
  • 可変長(サイズ変更可能)

Listが向いている用途

Listは「順序が意味を持つデータ」に適しています。

例:

  • 検索結果の表示順
  • メニューの並び
  • 処理の実行順序
  • 購入履歴やログ

同じ値が複数回現れる履歴データなどにも向いています。

配列との違いと使い分け

配列とListは似ていますが、用途は異なります。

項目 配列 List
サイズ変更 不可 可能
扱える型 プリミティブ可 参照型のみ
API 少ない 豊富
柔軟性 低い 高い

使い分けの基準

配列が向くケース

  • 固定サイズ
  • 高速な数値処理
  • メモリ効率重視

Listが向くケース

  • 要素数が変化する
  • 追加・削除が多い
  • 検索・加工処理が多い

👉 実務では ほとんどのケースでListを使用 します。

Listの宣言・生成・初期化

基本の宣言方法

List<String> list = new ArrayList<>();

ポイント:

  • 型はListで受ける(インターフェース)
  • 実体はArrayListなどで生成

→ 実装変更に強くなる

空のListを作成

List<String> list = new ArrayList<>();

不変リスト:

List<String> list = List.of();

※ addすると例外

初期値付きList

List<String> list = List.of("A", "B");

変更したい場合:

List<String> list = new ArrayList<>(List.of("A", "B"));

Listの基本操作

要素の追加

list.add("Apple");
list.add(1, "Banana"); // 指定位置に挿入

要素の取得

String item = list.get(0);

要素の変更

list.set(0, "Orage");

要素の削除

list.remove(0); // 位置指定
list.remove("Orange"); // 値指定

⚠ Integerの削除注意

list.remove(Integer.valueOf(1));

件数・存在確認

list.size();
list.isEmpty();
list.contains("Apple");

Listの繰り返し処理(重要)

拡張for(最も一般的)

for (String name : list) {
 System.out.println(name);
}

for文(インデックスが必要)

for (int i = 0; i < list.size(); i++) {
 System.out.println(i + " : " + list.get(i));
}

拡張for文やfor文などの繰り返し処理についてはこちらの記事もご参考ください!

Iterator(削除を伴う場合)

Integer<String> it = list.iterator();
while (it.hasNext()) {
 if (it.next().equals("Apple")) {
  it.remove();
 }
}

⚠ 注意点

  • 走査中のadd/removeは例外の原因
  • LinkedListでget(i)多用は低速
  • 削除はremoveIfが安全
list.removeIf(x -> x.isEmpty());

ArrayListとLinkedListの違い

内部構造の違い

特徴 ArrayList LinkedList
構造 配列 ノード連結
ランダムアクセス 高速 遅い
末尾追加 高速 高速
先頭追加 遅い 高速
メモリ効率 良い 悪い

実務での選び方

迷ったらArrayList

✔ LinkedListが向くケース:

  • 先頭・末尾操作が多い
  • キュー用途

👉 多くのアプリではArrayListが最適です。

Listの加工・便利操作

ソート

list.sort(Comparator.naturalOrder());

オブジェクト:

users.sort(Comparator.comparing(User::getName));

部分取得

List<String> sub = list.sublist(0,2);

※ 元Listのビュー

重複削除

List<String> unique = 
 list.stream().distinct().toList();

コピー

List<String> copy = new ArrayList<>(list);

※ 浅いコピー

Listと他コレクションの変換

配列 ⇄ List

List<String> list = Arrays.asList(array);

String[] arr = list.toArray(new String[0]);

List → Set(重複排除)

Set<String> set = new LinkedHashSet<>(list);

List → Map

Map<Long, User> map =
 users.stream().collect (
  Collectors.toMap(User::getId, u -> u)
 );

Listは参照型である点に注意

List<String> a = new ArrayList<>();
List<String> b = a;

→ 同じ実体を共有

防御的コピー

List<String> copy = new ArrayList<>(list);

不変化

List<String> safe = List.copyOf(list);

💡 実務スキルを身につけたい人へ

List操作は基礎ですが、設計・パフォーマンス・安全性を理解することでコード品質は大きく向上します。

もし、

  • Javaを体系的に学びたい
  • 独学で限界を感じている
  • 実務レベルのコード設計を身につけたい

と感じているなら、ブラウザ上ですぐ学べる学習環境を活用するのもおすすめです。

ZeroCodePlus では、

  • 環境構築不要ですぐ開始
  • ゲーム感覚で手を動かして学習
  • 実務を意識したJava課題

といった特徴があり、学習のハードルを大きく下げてくれます。

👉 スキマ時間で実践力を伸ばしたい方は、一度体験してみると理解のスピードが変わります。

まとめ

ListはJava開発で最も重要なコレクションです。

重要ポイント

✔ 順序付き・可変長のデータ管理

✔ 宣言はList、実体はArrayList

✔ 走査は拡張forが基本

✔ 削除はremoveIfが安全

✔ 迷ったらArrayList

✔ 参照共有に注意

Listを正しく扱えるようになると、データ処理の設計力が一段上がります。

基礎を確実に身につけ、実務で通用するコードを書けるエンジニアを目指していきましょう。

Join us! 未経験からエンジニアに挑戦できる環境で自分の可能性を信じてみよう 採用ページを見る→

記事監修

ドライブライン編集部

[ この記事をシェアする ]

記事一覧へ戻る