はじめに
Javaでリスト構造を扱うときによく使うのが ArrayList と LinkedList。
でも、こう思いませんか?
- 「違いがよく分からない…」
- 「いつ
ArrayListを使って、いつLinkedListを使えばいいの?」
この記事では、そんなあなたの疑問を完全に解消します!
図と具体例を交えて、ArrayList と LinkedList の違い、使い分けの判断基準、そして実務での注意点までやさしく解説します。
ArrayList と LinkedList の基本構造の違い
✅ ArrayList:内部に配列を持つ
|
1 2 |
List<String> list = new ArrayList<>(); |
- 要素をインデックスで素早く取得できる
- メモリの使い方が効率的
- 末尾への追加が高速(O(1))
✅ LinkedList:ノードが前後につながる
|
1 2 |
List<String> list = new LinkedList<>(); |
- 先頭や途中での追加・削除が得意
- ランダムアクセスは遅い(O(n))
- メモリの使い方にやや余分がある(ポインタが必要)
【図解】ArrayListとLinkedListの構造イメージ
使い分けの早見表
| 判断基準 | ArrayList | LinkedList |
|---|---|---|
| ランダムアクセス | 速い(O(1)) | 遅い(O(n)) |
| 途中の挿入・削除 | 遅い(要素をずらす) | 速い(ノードのつなぎ替え) |
| メモリ効率 | 良い | やや悪い(参照情報を保持) |
| 柔軟性 | 固定的 | 柔軟(構成変更に強い) |
| Deque操作 | 非推奨(ArrayDeque推奨) | 適している(Deque実装済) |
実際の使い分け例
✅ 例1:末尾に大量に追加して、インデックスで読み取る
|
1 2 3 4 5 6 |
List<String> list = new ArrayList<>(); for (int i = 0; i < 100000; i++) { list.add("item" + i); } String item = list.get(50000); // 高速! |
→ ArrayList が断然おすすめ!
✅ 例2:リストの先頭や中間に要素を何度も追加・削除
|
1 2 3 4 5 6 7 |
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:スタックやキューとして使いたい
|
1 2 3 4 |
Deque<String> queue = new LinkedList<>(); queue.addLast("A"); // enqueue String next = queue.removeFirst(); // dequeue |
→ LinkedList なら Deque として使える!
※ ただし、本格的なキュー用途なら ArrayDeque の方が高速です。
実行速度を比較してみよう!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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(場合により) |
よくある間違い
LinkedListでget(i)を多用 → 超遅い!ArrayListで先頭にadd(0, element)を多用 → 毎回シフト処理で非効率!LinkedListを使えば常に速いと思い込む → 実はArrayListの方が速いことも多い!
自己学習・転職対策にも!
Javaの基礎から現場で使える知識まで網羅的に学ぶには、まず以下を読み込むのがオススメ!
独学が不安な方、転職も視野に入れている方は、サイゼントアカデミーでの本格学習も検討してください。
まとめ
ArrayListは 読み取り重視・固定構造向けLinkedListは 挿入・削除が多い場面向け- 多くの場合、迷ったら ArrayList でOK!
- でも、適材適所で選ぶことがパフォーマンスのカギ!


コメント