1日目のゴール
1日目のテーマは
「配列は“長さが固定”、ArrayList は“長さが変えられる”」という感覚をつかむこと です。
今日はまだ、メソッド名を全部暗記する日ではありません。
頭の中にまず、
「配列=箱の数が最初に決まっていて変えられない」
「ArrayList=あとから増やしたり減らしたりできる“伸び縮みする箱”」
このイメージをしっかり作るのがゴールです。
配列の“窮屈さ”をあえて感じてみる
配列は「長さを最初に決める必要がある」
まずは、ふつうの配列から思い出してみます。
public class Main {
public static void main(String[] args) {
int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
System.out.println(scores[0]);
System.out.println("人数: " + scores.length);
}
}
Javaここでやっていることはこうです。
new int[3]で「3個入る箱」を作る- そのあとで、0番・1番・2番に値を入れている
ここで重要なのは、
「3という数は、最初に決めたら変えられない」 ということです。
途中で「やっぱり4人分の点数を入れたい」と思っても、
この scores の長さを 4 に変えることはできません。
配列でよくハマるパターン
例えば、こんな状況を想像してください。
- 最初は「3人分の点数を管理しよう」と思って配列を作った
- あとから「やっぱり4人目も追加したい」となった
コードで書くとこうなります。
int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 75;
// ここで「4人目も入れたい」と思った
scores[3] = 88; // 実行時エラー(配列の範囲外)
Javaコンパイルは通りますが、実行するとエラーになります。
「配列の長さは3なのに、4番目(インデックス3)にアクセスしようとした」からです。
ここで感じてほしいのは、
「配列は、あとから増やしたくなったときに不便」 ということです。
可変長データって何か?をイメージでつかむ
「何個になるか分からないもの」を扱いたい
現実のアプリでは、
最初から「何個になるか」決まっていないデータがたくさんあります。
- 買い物カゴに入れる商品
- チャットのメッセージ
- タスク管理アプリのタスク
- ゲームの敵の出現履歴
こういうものは、
- 最初は0個かもしれない
- 途中でどんどん増えるかもしれない
- 場合によっては減るかもしれない
つまり、
「個数が変わる前提のデータ」=可変長データ です。
配列は「長さ固定」なので、
この可変長データを扱うにはちょっと窮屈です。
そこで登場するのが、
ArrayList です。
ArrayList は「伸び縮みする配列」だと思っていい
まずは一番シンプルなコードを見てみる
ArrayList を使うには、最初に import が必要です。
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("山田");
names.add("佐藤");
names.add("鈴木");
System.out.println("0番目: " + names.get(0));
System.out.println("人数: " + names.size());
}
}
Javaここで出てきた新しいものを、ゆっくり分解します。
<String> の意味
ArrayList<String> names = new ArrayList<>();
JavaArrayList<String> は
「String を入れるための ArrayList」という意味です。
<String> の部分は、
「このリストに何を入れるか」 を表しています。
<String>→ 文字列のリスト<Integer>→ 整数のリスト<Book>→ Book クラスのオブジェクトのリスト(後のステップ)
今日の時点では、
「ArrayList の <String> は“中身の型”を表している」
と理解できていれば十分です。
add・get・size の役割
names.add("山田");
names.add("佐藤");
names.add("鈴木");
Javaadd は「末尾に追加する」メソッドです。
配列のように「何番目に入れるか」を自分で考えなくてよく、
順番に後ろへ入っていきます。
System.out.println(names.get(0));
Javaget(0) は「0番目の要素を取り出す」メソッドです。
配列の names[0] に近いイメージです。
System.out.println("人数: " + names.size());
Javasize() は「今、何個入っているか」を返してくれます。
配列の length に近いですが、こちらはメソッドです。
ここで一番大事なのは、
「最初に“何人分”と決めていないのに、どんどん追加できている」
という感覚です。
配列と ArrayList を並べて比べる
同じことを2通りで書いてみる
「名前を3人分管理する」という同じ目的を、
配列と ArrayList で書き比べてみます。
配列版
public class Main {
public static void main(String[] args) {
String[] names = new String[3];
names[0] = "山田";
names[1] = "佐藤";
names[2] = "鈴木";
System.out.println("0番目: " + names[0]);
System.out.println("人数: " + names.length);
}
}
JavaArrayList 版
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("山田");
names.add("佐藤");
names.add("鈴木");
System.out.println("0番目: " + names.get(0));
System.out.println("人数: " + names.size());
}
}
Javaここで意識してほしいポイントは、次の2つです。
- 配列は「最初に3と決めている」
- ArrayList は「最初は空っぽで、あとから3人追加している」
そして、
「ArrayList のほうが、“何人になるか分からない”状況に強い」
ということです。
ArrayList の「増える・減る」を体で感じる
追加と削除を試してみる
ArrayList の強みは、「増える」だけでなく「減る」ことも簡単な点です。
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("山田");
names.add("佐藤");
names.add("鈴木");
System.out.println("最初の人数: " + names.size());
names.remove(1);
System.out.println("削除後の人数: " + names.size());
System.out.println("0番目: " + names.get(0));
System.out.println("1番目: " + names.get(1));
}
}
Javaこのコードで起きていることを、順番に追ってみます。
- 最初は「山田」「佐藤」「鈴木」の3人が入る
names.remove(1);で「インデックス1(佐藤)」を削除する- 削除後は「山田」「鈴木」の2人になる
- インデックスも詰められて、
0番目が「山田」、1番目が「鈴木」になる
ここで感じてほしいのは、
「ArrayList は、真ん中の要素を消しても、ちゃんと詰めてくれる」
ということです。
配列で同じことをやろうとすると、
自分で要素をずらしたり、別の配列を作ったりする必要が出てきます。
ArrayList は、その面倒を全部やってくれる「賢い配列」だと思ってOKです。
1日目のミニアプリ:買い物リスト
仕様を言葉で決める
今日の仕上げとして、
とてもシンプルな「買い物リストアプリ」を作ってみます。
やりたいことはこうです。
- 買いたいものを、順番にリストに追加する
- 途中で「やっぱりこれはいらない」と削除できる
- 最後に、買い物リストの中身と個数を表示する
コード全体
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> shoppingList = new ArrayList<>();
shoppingList.add("牛乳");
shoppingList.add("パン");
shoppingList.add("卵");
System.out.println("最初のリスト:");
showList(shoppingList);
System.out.println("パンはいらなくなったので削除します。");
shoppingList.remove(1);
System.out.println("削除後のリスト:");
showList(shoppingList);
}
static void showList(ArrayList<String> list) {
System.out.println("品目数: " + list.size());
for (int i = 0; i < list.size(); i++) {
System.out.println((i + 1) + " : " + list.get(i));
}
}
}
Javaこのミニアプリで体感してほしいのは、次の3つです。
- 最初は空っぽのリストから始められる
addでどんどん増やせるremoveで途中のものを消しても、ちゃんと詰めてくれる
つまり、
「買い物リストのような“増えたり減ったりするデータ”には ArrayList がぴったり」
という感覚です。
今日いちばん大事な“頭の中のイメージ”
1日目で絶対に持って帰ってほしいのは、このイメージです。
配列のイメージ
- 「箱の数を最初に決める必要がある」
- 「あとから増やしたくなると、ちょっとつらい」
ArrayList のイメージ
- 「最初は空っぽでいい」
- 「
addでいくらでも増やせる」 - 「
removeで消したら、ちゃんと詰めてくれる」 - 「
sizeで“今何個あるか”が分かる」 - 「
<String>は“このリストの中身の型”を表している」
この2つのイメージが頭に入っていれば、
1日目としては大成功です。
2日目以降は、
ArrayList をクラスの中に持たせたり、
オブジェクトのリストを扱ったりして、
もっと“アプリっぽい”使い方に踏み込んでいきます。

