【Java】配列はもう卒業?「List(リスト)」を使ってデータを自由自在に操ろう!
はじめに
みなさんどうも、おげんです。
前回の記事でRPGの戦闘システムを設計した際、しれっとこんなコードを書いたのを覚えていますか?
List<Character> party = new ArrayList<>();
これ、実はJavaを扱う上で、配列(Array)よりも圧倒的に出番が多い「List(リスト)」という超便利な道具なんです。
プログラミングを始めたばかりの頃、データをまとめて扱うには「配列」を習いますよね。
でも、実際にアプリやゲームを作ってみると、こんな壁にぶつかりませんか?
- 「最初に『5人分』って決めたら、後から仲間が増やせない!」
- 「途中のデータを消したら、後ろのデータを詰めなきゃいけないの……?」
そんな「配列のちょっと不便なところ」をすべて解決してくれるのが、今回ご紹介する List です。
データの増減を自由自在に操れるようになると、あなたのプログラムは一気に「実用的なシステム」へと進化します。
今回も、一歩ずつ一緒に学んでいきましょう!
- 「配列」のサイズ制限にイライラしたことがある人
- 前回の記事に出てきた
ArrayListの正体を知りたい人 - 大量のデータを賢く、楽に管理したいと思っている人
配列と List の決定的な違い
「データをまとめて扱う」という点では、配列(Array)も List も同じです。
でも、その「柔軟性」がまったく違います。
イメージしやすいように、乗り物に例えてみましょう。
- 配列(Array)は「定員制のバス」 出発前に「5人乗り!」と決めたら、後から6人目が来ても乗せられません。無理やり乗せるには、新しいバスを買い直して全員引っ越すしかありません。
- List は「連結自在の列車」 乗客が増えたら、後ろに車両を「ポチッ」と連結するだけ。逆に減ったら切り離すのも自由。最初から正確な人数を決めておかなくても大丈夫なんです。
ここが List の「神」ポイント!
- サイズが自動で伸び縮みする:
newしたあとに「やっぱり100個に増やしたい」と思っても、List なら勝手にやってくれます。 - 途中の抜き差しが得意: 「2番目のデータを消して、後ろを全部前に詰める」なんていう面倒な処理も、メソッド一つで完了します。
- 「いま何人?」がすぐわかる: 配列だと「中身が入っている場所」を自分で数える必要がありますが、List は常に自分のサイズを知っています。
実務の世界では、あらかじめデータの数がきっちり決まっていることなんて滅多にありません。だからこそ、この「あとからどうにでもなる」List が主役になるんです。
よく使う!ArrayList の基本操作
List(正確には、一番よく使われる ArrayList)を使うために、まずはこの3つの操作を覚えましょう。これだけで、データの管理が劇的に楽になります。
① データを追加する: add()
「仲間が増えた!」というときは、これを使うだけ。自動的に一番後ろに連結されます。
List<String> party = new ArrayList<>();
party.add("おげん"); // 1人目
party.add("アリス"); // 2人目
party.add("ボブ"); // 3人目(自動でサイズが増える!)② データを取り出す: get()
「2番目の仲間、だれだっけ?」というときに使います。
※プログラミングの世界では、数え方は 0番目 から始まるので注意です!
String secondMember = party.get(1); // "アリス" が取り出せる③ 今いくつ入っているか数える: size()
「今、パーティーは何人編成?」と聞くときに便利です。
int count = party.size(); // 3 が返ってくる配列との「書き方」の違い
配列だと party[1] と書いていたところが、Listだと party.get(1) になります。
「メソッド(命令)」を使ってやり取りするのが、オブジェクト指向らしいスマートな書き方ですね。
拡張for文との組み合わせ
Listにデータを入れたら、次はそれらを「全部一気に使いたい」ですよね。
そんな時に最強の相棒となるのが、「拡張for文」です。
「1つずつ順番に」を自動でやってくれる
これまでの普通のfor文だと、「0番目から数えて、サイズより小さい間、1ずつ増やして……」と、書くのが少し面倒でした。
拡張for文を使えば、そんな細かい指定は一切不要です!
List<String> party = new ArrayList<>();
party.add("おげん");
party.add("アリス");
party.add("ボブ");
// party(List)の中から、1つずつ取り出して「name」に入れてね!
for (String name : party) {
System.out.println(name + "が仲間になった!");
}ここがListの便利なところ!
前回のRPGのコードを思い出してみてください。
for (Character c : party) {
c.attack();
}このとき、party の中に戦士が1人だろうが、魔法使いが100人だろうが、この2行だけで全員に命令が出せます。
- 「いま何人いるか」を自動で判別してくれる
- 「最後の1人」が終わったら勝手に止まってくれる
Listと拡張for文を組み合わせれば、データがどれだけ増えても、あなたのコードはずっとスッキリしたままなんです。
まとめ:配列とList、どっちを使う?
今回は、Javaでデータを扱う最強の味方「List(ArrayList)」について学びました。
最後に、「配列」と「List」の使い分けをスッキリ整理しておきましょう。
| 特徴 | 配列(Array) | List(ArrayList) |
| サイズ | 最初から固定(変えられない) | 自由自在に伸び縮みする |
| データの追加 | できない(空きが必要) | add() でいつでも追加OK |
| 便利機能 | ほぼなし | 検索、削除、並び替えなど豊富 |
| 使いどころ | 速度重視や、数が絶対に変わらない時 | 迷ったらこっち!基本はList |
「基本はList」でOK!
現代のJava開発において、データの管理に配列を使うシーンはかなり限られています。
実務でも、「とりあえずListに入れておく」のが一番修正に強く、安全な選択であることがほとんどです。
前回の「オブジェクト指向」がプログラムの形を作るための知識だとしたら、今回の「List」は、その中で動くデータを操るための知識です。
この2つが揃えば、もうあなたは「自分の思い通りのデータを、思い通りの仕組みで動かす」ことができるエンジニアの第一歩を踏み出しています。
ぜひ、前回のRPGコードを改造して、新しい仲間をどんどん add() して動かしてみてくださいね!
今回も最後まで読んでいただき、ありがとうございました!
