【図解&コード例付き】JavaのArrayListとLinkedList、違いと使い分け完全ガイド!

Java

はじめに

Javaでリスト構造を扱うときによく使うのが ArrayListLinkedList

でも、こう思いませんか?

  • 「違いがよく分からない…」
  • 「いつ ArrayList を使って、いつ LinkedList を使えばいいの?」

この記事では、そんなあなたの疑問を完全に解消します!

図と具体例を交えて、ArrayListLinkedList の違い、使い分けの判断基準、そして実務での注意点までやさしく解説します。


ArrayList と LinkedList の基本構造の違い

✅ ArrayList:内部に配列を持つ

List<String> list = new ArrayList<>();
  • 要素をインデックスで素早く取得できる
  • メモリの使い方が効率的
  • 末尾への追加が高速(O(1))

✅ LinkedList:ノードが前後につながる

List<String> list = new LinkedList<>();
  • 先頭や途中での追加・削除が得意
  • ランダムアクセスは遅い(O(n))
  • メモリの使い方にやや余分がある(ポインタが必要)

【図解】ArrayListとLinkedListの構造イメージ

リスト構造の図解

使い分けの早見表

判断基準ArrayListLinkedList
ランダムアクセス速い(O(1))遅い(O(n))
途中の挿入・削除遅い(要素をずらす)速い(ノードのつなぎ替え)
メモリ効率良いやや悪い(参照情報を保持)
柔軟性固定的柔軟(構成変更に強い)
Deque操作非推奨(ArrayDeque推奨)適している(Deque実装済)

実際の使い分け例

✅ 例1:末尾に大量に追加して、インデックスで読み取る

List<String> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    list.add("item" + i);
}
String item = list.get(50000); // 高速!

ArrayList が断然おすすめ!


✅ 例2:リストの先頭や中間に要素を何度も追加・削除

List<String> list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
list.add(1, "X"); // A, X, B, C
list.remove(2);   // A, X, C

LinkedList の方が自然で効率的!


✅ 例3:スタックやキューとして使いたい

Deque<String> queue = new LinkedList<>();
queue.addLast("A");  // enqueue
String next = queue.removeFirst(); // dequeue

LinkedList なら Deque として使える!

※ ただし、本格的なキュー用途なら ArrayDeque の方が高速です。


実行速度を比較してみよう!

List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
int N = 100000;

// データ追加
for (int i = 0; i < N; i++) {
    arrayList.add(i);
    linkedList.add(i);
}

// get() の速度測定
long t1 = System.nanoTime();
for (int i = 0; i < N; i++) arrayList.get(i);
long t2 = System.nanoTime();
System.out.println("ArrayList get: " + (t2 - t1) + "ns");

long t3 = System.nanoTime();
for (int i = 0; i < N; i++) linkedList.get(i);
long t4 = System.nanoTime();
System.out.println("LinkedList get: " + (t4 - t3) + "ns");

実行すると、ArrayList の方が はるかに高速であることがわかります。


実務でのおすすめ

用途おすすめ
データの蓄積・高速参照ArrayList
頻繁な挿入・削除(先頭・中間)LinkedList
スタック・キュー処理ArrayDeque or LinkedList
メモリ使用を抑えたいArrayList
複雑なリスト構成LinkedList(場合により)

よくある間違い

  • LinkedListget(i) を多用 → 超遅い!
  • ArrayList で先頭に add(0, element) を多用 → 毎回シフト処理で非効率!
  • LinkedList を使えば常に速いと思い込む → 実は ArrayList の方が速いことも多い!

自己学習・転職対策にも!

Javaの基礎から現場で使える知識まで網羅的に学ぶには、まず以下を読み込むのがオススメ!

絶対にJavaプログラマーになりたい人へ。

独学が不安な方、転職も視野に入れている方は、サイゼントアカデミーでの本格学習も検討してください。

サイゼントアカデミー


まとめ

  • ArrayList読み取り重視・固定構造向け
  • LinkedList挿入・削除が多い場面向け
  • 多くの場合、迷ったら ArrayList でOK!
  • でも、適材適所で選ぶことがパフォーマンスのカギ!

コメント

タイトルとURLをコピーしました