はじめに
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!
- でも、適材適所で選ぶことがパフォーマンスのカギ!
コメント