JavaのArrayListとは、要素を後から追加したり削除したりしやすいListの代表的な実装です。
配列は最初に長さを決めて使いますが、ArrayListは要素数が変わるデータを扱うときに便利です。たとえば、ユーザー名を順番に追加したい場面や、取得した検索結果を一覧で持ちたい場面でよく出てきます。

まずは『配列は長さ固定、ArrayListは後から増やしやすい』と分けて読むだけで十分です。
この記事では、ArrayListの意味、配列との違い、add・get・set・removeの基本、for文での読み方、初心者がつまずきやすい点を順番に整理します。
なお、配列そのものの宣言・初期化や多次元配列はJavaの配列の記事に任せ、この記事ではArrayListのコードを読めるようになることに絞ります。ListやMap全体の整理はコレクションフレームワークの記事で扱います。
まず結論:ArrayListは要素数を増減しやすいList
ArrayListは、JavaのListを扱うときに最初によく出会うクラスです。内部では配列を使う実装ですが、使う側は要素の追加や削除をメソッドで扱えます。
OracleのAPI仕様でも、ArrayListはListインターフェースの可変長配列実装として説明されています。
次の図では、配列とArrayListを『長さが固定か』『後から追加しやすいか』の2点で比較して見てください。

配列との違い
| 比較 | 配列 | ArrayList |
|---|---|---|
| 長さ | 最初に決める | 後から増減しやすい |
| 値の取得 | names[0] | names.get(0) |
| 追加 | 自分で新しい配列を用意する場面がある | add()で追加する |
| 件数 | length | size() |
配列の基本がまだ曖昧な場合は、先にJavaの配列を読んでおくと、ArrayListとの違いが見えやすくなります。
まずはこのコードを読めればOK
ArrayListの第一歩は、次のコードを読めることです。
import java.util.ArrayList;
import java.util.List;
List<String> names = new ArrayList<>();
names.add("Sato");
names.add("Suzuki");
System.out.println(names.get(0)); // Sato
System.out.println(names.size()); // 2
このコードでは、namesというListを作り、2件追加し、0番目の値と件数を取り出しています。
なぜ左側をList<String>で書くのかは、コレクションフレームワークやジェネリクスの記事とつなげて理解すると整理しやすいです。
add・get・set・removeの基本
| メソッド | 役割 | 例 |
|---|---|---|
add() | 末尾へ追加する | names.add("Tanaka") |
get() | 指定位置の値を読む | names.get(1) |
set() | 指定位置の値を置き換える | names.set(0, "Yamada") |
remove() | 指定位置や値を削除する | names.remove(1) |
ここで大事なのは、位置番号が0から始まることです。get(0)は1件目、get(1)は2件目を意味します。
names.set(0, "Yamada");
names.remove(1);
System.out.println(names);
setは値の置き換え、removeは削除です。削除後は後ろの要素が詰まるため、番号の見え方が変わる点にも注意してください。
for文で中身を読む
ArrayListの中身を見るときは、拡張for文がよく使われます。
for (String name : names) {
System.out.println(name);
}
番号も使いたい場合は、次のように通常のfor文で書けます。
for (int i = 0; i < names.size(); i++) {
System.out.println(i + ": " + names.get(i));
}
for文そのものの読み方が不安な場合は、Javaのfor文を先に確認すると進みやすいです。
ArrayListを使う場面と配列を使う場面
初心者のうちは『件数が変わりそうならArrayList』と考えると、大きく外しません。
実務コードではList型で受け取ることが多い
実務のコードでは、次のように左側をList、右側をArrayListで書く形をよく見ます。
List<String> names = new ArrayList<>();
これは『変数としてはListとして扱い、実際の中身にはArrayListを使う』という書き方です。最初は難しく見えますが、読むときはnamesには文字列の一覧が入る、と考えれば大丈夫です。
この書き方にしておくと、あとから別のList実装に変えたくなった場合でも、使う側のコードを変えずに済むことがあります。初心者のうちは設計上の細かい理由を暗記するより、まず『左は扱い方、右は実体』と分けて読むのが大切です。
ArrayListの中身を変えるときの考え方
ArrayListは、値を入れて終わりではありません。追加、置き換え、削除によって中身が変わります。コードを読むときは、メソッドを見たら『一覧の中身がどう変わったか』を1行ずつ追うようにします。
List<String> names = new ArrayList<>();
names.add("Sato"); // [Sato]
names.add("Suzuki"); // [Sato, Suzuki]
names.set(0, "Yamada"); // [Yamada, Suzuki]
names.remove(1); // [Yamada]
このようにコメントで状態を書き出すと、ArrayListの動きがかなり見えやすくなります。練習中は、頭の中だけで追わずに紙やコメントで一覧の状態を書いてみるのがおすすめです。
初心者がつまずきやすいポイント
| つまずき | まずこう理解する |
|---|---|
lengthとsize()が混ざる | 配列はlength、ArrayListはsize() |
1件目をget(1)で読む | 番号は0から始まる |
| 削除後の位置が変わる | remove後は後ろの要素が前へ詰まる |
ArrayListの意味が分からない | 入れる要素の型を指定している |
この4点を先に押さえておくと、初見のArrayListコードでもかなり読みやすくなります。
よくある疑問
ArrayListにはnullを入れられる?
ArrayListにはnullを入れることもできます。ただし、初心者の段階では、nullが混ざるとgetした後の処理でつまずきやすくなります。特別な理由がない限り、一覧の中にnullを入れない設計にした方が読みやすいです。
最初からArrayListだけ覚えれば配列はいらない?
ArrayListは便利ですが、配列の理解が不要になるわけではありません。ArrayListの内部イメージや、メソッドの引数・戻り値で配列が出てくる場面を読むためにも、配列の考え方は土台になります。順番としては、配列で『同じ型の値が並ぶ』感覚を作り、その次にArrayListへ進むのがおすすめです。
ArrayListはどんなときに避ける?
複数のスレッドから同時に更新するような場面では、ArrayListをそのまま使うと注意が必要です。ただし、初心者が最初に覚える段階では、まず1つの処理の中で一覧を追加・取得・削除する基本を固める方が重要です。
公式情報と関連して読みたい記事
まとめ
ArrayListは、配列よりも要素の追加や削除を扱いやすいListです。
配列とArrayListを分けて読めるようになると、コレクション記事やStream APIの記事へかなり進みやすくなります。
