【Java】サイズ変更も自由自在!超便利な「ArrayList」の使い方
はじめに
みなさんどうも、おげんです。
以前の記事で、たくさんのデータをまとめて管理できる「配列」について解説しました。
でも、配列を使っていると、必ずと言っていいほどこんな壁にぶち当たります。
「あ、後からもう一つデータを追加したいけど、もう箱がいっぱいだ……」
Javaの配列は、最初に「箱の数は10個!」と決めたら、後から増やすことも減らすこともできない、頑丈すぎる木箱のような存在です。
でも、私たちが普段作っているアプリでは「データがいくつになるか、やってみないとわからない」という場面の方が圧倒的に多いですよね。
そんな時に大活躍するのが、今回紹介する 「ArrayList(リスト)」 です。
これを使えば、データの数に合わせて箱が勝手に伸び縮みしてくれます。
「配列のちょっと不便なところ」を全部解決してくれる、エンジニアにとっては魔法のような道具を、一緒にマスターしていきましょう!
- 配列の「サイズ固定」に不便さを感じている人
- データの追加や削除をもっと楽にやりたい人
- ArrayListの基本を押さえたい人
配列 vs ArrayList(何が違うの?)
言葉で説明するよりも、イメージで比較すると一瞬でわかります。
- 配列(Array): 頑丈な 「木箱」 です。最初に「5人分」と決めて作ったら、6人目は入りません。無理に入れようとすると、あの長すぎる名前のエラー(ArrayIndexOutOfBoundsException)を吐いてJavaが止まってしまいます。
- ArrayList: 伸縮自在な 「ゴム袋」 です。1人入れば1人分のサイズに、100人入れば100人分のサイズに、Javaが裏側で勝手に調整してくれます。
「じゃあ、全部ArrayListでいいじゃん!」と思うかもしれません。
実際、現場の開発ではArrayListを使うことの方が圧倒的に多いです。
でも、配列の方が動作が少しだけ速かったり、メモリを節約できたりというメリットもあります。
とはいえ、まずは「自由自在に形を変えられるArrayList」を使いこなせるようになることが、脱・初心者への近道ですよ!
ArrayListの書き方と「ラッパークラス」
ArrayListを使うには、Javaに「これからリストを使いますよ!」と宣言し、専用の書き方に従う必要があります。
呪文のインポート
まず、プログラムの最初(classより上)にこの一行を書きます。
import java.util.ArrayList;基本の書き方
配列とは少し書き方が違います。例えば、整数のリストを作るならこう書きます。
ArrayList<Integer> list = new ArrayList<>();「あれ、int じゃないの?」と思った方、大正解です。ここが最大のポイントです。
なぜ「Integer」と書くのか?
ArrayListには、「小文字で始まる基本の型(int, doubleなど)は直接入れられない」というちょっとワガママなルールがあります。
そこで、int を包んで「クラス」という立派な形にした Integer(ラッパークラス) を使ってあげます。
- int(おなじみの型) → Integer(リスト用の型)
- double(小数) → Double
- boolean(判定) → Boolean
「いちいち書き換えるの面倒だな…」と思うかもしれません。
しかし、Javaが勝手に変換してくれる(オートボクシング)ので、「リストの時は大文字から始まる名前で宣言するんだな」とだけ覚えておけばOKです!
基本の操作(追加・取得・削除)
ArrayListの操作は、専用の「命令(メソッド)」を呼ぶだけです。 配列と違って、Javaが裏側でいい感じに調整してくれるのが最大のメリットです。
① データの追加(add)
これが一番の感動ポイント。箱のサイズを気にせず、どんどん放り込めます。
list.add(100);
list.add(200);これだけで、自動的に「0番目に100」「1番目に200」と箱が作られて格納されます。
② データの取得(get)
配列の list[0] の代わりに、get メソッドを使います。
int value = list.get(0); // 100が取り出せる③ データの削除(remove)
配列では難しかった「中抜き」も一瞬です。
list.remove(0); // 0番目のデータを削除ここが凄いのですが、0番目を消すと、後ろにいた1番目以降のデータが自動的に前へ詰められます。 私たちが手動でずらす必要はありません!
要素の数を知る(size)
配列では .length でしたが、ArrayListでは .size() メソッドを使います。
「今、ゴム袋の中にいくつ入ってる?」と聞くイメージですね。
ArrayListに溜まったデータを全部表示したいとき、size() メソッドが大活躍します。
ArrayListとfor文を組み合わせてみよう
演算子のところで学んだ i++ を使って、中身を一つずつ取り出してみましょう!
import java.util.ArrayList;
public class ListLoopSample {
public static void main(String[] args) {
// 整数のリストを作成
ArrayList<Integer> scores = new ArrayList<>();
// データを追加(add)
scores.add(80);
scores.add(95);
scores.add(70);
// size() を使って、リストの中身を全部表示する
// scores.size() は、この場合「3」を返してくれます
for (int i = 0; i < scores.size(); i++) {
System.out.println(i + "番目のスコア:" + scores.get(i));
}
System.out.println("--- データを追加後 ---");
// 後からデータを追加しても、size() が自動で更新されるので
// for文を書き直す必要はありません!
scores.add(100);
for (int i = 0; i < scores.size(); i++) {
System.out.println(i + "番目のスコア:" + scores.get(i));
}
}
}なぜ size() なの?
配列の length(長さ)は、箱の数そのもの。 ArrayListの size()(サイズ)は、「今、実際に入っているデータの数」です。
後からデータを add すれば size() は増えるし、remove すれば減ります。
どんなに中身が伸び縮みしても、i < scores.size() と書いておけば、常にピッタリの回数だけループしてくれる。
これが ArrayList の凄さです!
まとめ:データの扱いをもっと自由に!
今回は、中身に合わせて形を変える魔法の袋「ArrayList」について解説しました。
- ArrayListはサイズ変更が自由自在! 後から追加も削除も思いのまま。
- 「ラッパークラス(Integerなど)」 を使うのがJavaのルール。
- 操作はメソッドで行う。
addで追加、getで取得、removeで削除。 size()メソッド を使えば、データの数に関わらずループ処理ができる。
プログラミングをしていると、「何個のデータを扱うか決まっていない」ことの方が普通です。
そんな時、ArrayListを使いこなせれば、どんなに大量のデータが来ても怖くありません。
これまでは「Javaの文法」というパーツを一つずつ学んできましたが、次はいよいよ、これらを組み合わせて大きな仕組みを作る 「クラス」や「オブジェクト指向」 の世界が待っています。
少しずつ、でも確実にエンジニアの道具箱が充実してきましたね。 自分のプロジェクトで「ここは配列じゃなくてArrayListにしてみようかな?」と考えることが、成長の第一歩です!
今回も最後まで読んでいただき、ありがとうございました。 また次の一歩を、共に進めていきましょう。
