この記事の要点
• 配列は同じ型の値を複数格納するデータ構造
• 宣言は int[] arr = new int[5]; または int[] arr = {1, 2, 3};
• 要素は arr[0] のようにインデックスでアクセス(0始まり)
このシリーズについて
「Java入門」は1本1テーマで進む全15回のシリーズです。本記事はその第10回として、配列の基本を扱います。
前提条件: Java 21 がインストール済み。変数、for文、while文の基本を理解していること。
配列とは
配列(Array) は同じ型の値を複数まとめて扱うデータ構造です。
| 特徴 | 説明 |
|---|---|
| 固定長 | 作成時にサイズが決まり、後から変更できない |
| インデックスアクセス | arr[0], arr[1] のように位置で要素を取得 |
| 0始まり | 最初の要素は arr[0]、最後は arr[length - 1] |
| 同じ型のみ | int[] なら整数のみ、String[] なら文字列のみ |
配列を使わない場合、5つの値を扱うには5つの変数が必要です。
int score0 = 85;
int score1 = 90;
int score2 = 78;
int score3 = 92;
int score4 = 88;
配列なら1つの変数で管理できます。
int[] scores = {85, 90, 78, 92, 88};
配列の宣言と初期化
パターン1: サイズを指定して作成
型[] 変数名 = new 型[サイズ];
// Java 21
public class ArrayDeclaration {
public static void main(String[] args) {
int[] numbers = new int[5]; // 要素数5の配列
// 初期値は自動で 0 になる
System.out.println(numbers[0]); // → 0
}
}
| 型 | 初期値 |
|---|---|
int, long, short, byte | 0 |
double, float | 0.0 |
boolean | false |
String, オブジェクト | null |
パターン2: 初期値を指定して作成
型[] 変数名 = {値1, 値2, 値3, ...};
// Java 21
public class ArrayInitialization {
public static void main(String[] args) {
int[] scores = {85, 90, 78, 92, 88};
System.out.println(scores[0]); // → 85
System.out.println(scores[4]); // → 88
}
}
ポイント: 初期値がわかっているなら {...} 記法が簡潔です。サイズだけ決めて後から値を入れる場合は new 型[サイズ] を使います。
要素へのアクセス
配列の要素はインデックス(添字)でアクセスします。インデックスは0から始まる点に注意してください。
// Java 21
public class ArrayAccess {
public static void main(String[] args) {
String[] fruits = {"Apple", "Banana", "Cherry"};
System.out.println(fruits[0]); // → Apple
System.out.println(fruits[1]); // → Banana
System.out.println(fruits[2]); // → Cherry
// 値の変更
fruits[1] = "Blueberry";
System.out.println(fruits[1]); // → Blueberry
}
}
| 操作 | 構文 |
|---|---|
| 値を取得 | 変数名[インデックス] |
| 値を変更 | 変数名[インデックス] = 新しい値; |
注意: 存在しないインデックスにアクセスすると ArrayIndexOutOfBoundsException(配列の範囲外例外)が発生します。
length プロパティ
配列の長さ(要素数)は .length で取得できます。
// Java 21
public class ArrayLength {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
System.out.println("配列の長さ: " + numbers.length); // → 5
// 最後の要素にアクセス
System.out.println("最後の要素: " + numbers[numbers.length - 1]); // → 50
}
}
| 記法 | 説明 |
|---|---|
arr.length | 配列の要素数(プロパティなのでカッコ不要) |
arr[arr.length - 1] | 最後の要素(長さが5なら arr[4]) |
補足: String の長さは str.length()(メソッド)ですが、配列は arr.length(プロパティ)です。カッコの有無に注意してください。
配列の走査(ループ)
通常のfor文
// Java 21
public class ArrayLoop {
public static void main(String[] args) {
int[] scores = {85, 90, 78, 92, 88};
for (int i = 0; i < scores.length; i++) {
System.out.println("scores[" + i + "] = " + scores[i]);
}
}
}
出力:
scores[0] = 85
scores[1] = 90
scores[2] = 78
scores[3] = 92
scores[4] = 88
拡張for文(for-each)
インデックスが不要なら、拡張for文が簡潔です。
for (型 変数名 : 配列) {
// 変数に順番に各要素が入る
}
// Java 21
public class ArrayForEach {
public static void main(String[] args) {
String[] fruits = {"Apple", "Banana", "Cherry"};
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
出力:
Apple
Banana
Cherry
| 書き方 | 用途 |
|---|---|
通常のfor (for (int i = 0; ...)) | インデックスが必要、要素を変更する |
拡張for (for (型 変数 : 配列)) | 全要素を順に参照するだけ |
ポイント: 拡張for文は読み取り専用です。要素の値を変更したい場合は通常のfor文を使います。
配列操作の早見表
| 操作 | コード例 | 備考 |
|---|---|---|
| サイズ指定で作成 | int[] arr = new int[5]; | 初期値は型のデフォルト値 |
| 初期値指定で作成 | int[] arr = {1, 2, 3}; | サイズは自動で決まる |
| 要素を取得 | arr[0] | インデックスは0始まり |
| 要素を変更 | arr[0] = 10; | |
| 長さを取得 | arr.length | メソッドではなくプロパティ |
| 全要素を走査(通常for) | for (int i = 0; i < arr.length; i++) | インデックスが必要な場合 |
| 全要素を走査(拡張for) | for (int x : arr) | 読み取り専用 |
二次元配列(触りだけ)
配列の配列を作ると二次元配列になります。
// Java 21
public class TwoDimensionalArray {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println(matrix[0][0]); // → 1
System.out.println(matrix[1][2]); // → 6
System.out.println(matrix[2][1]); // → 8
}
}
| 記法 | 意味 |
|---|---|
matrix[行][列] | 行と列で要素を指定 |
matrix.length | 行数 |
matrix[0].length | 0行目の列数 |
補足: 二次元配列の詳細は次回以降で扱います。ここでは「配列の中に配列を入れられる」ことだけ覚えてください。
実践例: 配列の合計と平均
// Java 21
public class ArraySum {
public static void main(String[] args) {
int[] scores = {85, 90, 78, 92, 88};
int sum = 0;
// 合計を計算
for (int score : scores) {
sum += score;
}
// 平均を計算
double average = (double) sum / scores.length;
System.out.println("合計: " + sum); // → 433
System.out.println("平均: " + average); // → 86.6
}
}
ポイント: (double) sum でキャストしないと整数割り算になり、小数点以下が切り捨てられます。
よくあるミス
1. 範囲外アクセス
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // エラー: インデックスは 0, 1, 2 のみ
2. length() と書いてしまう
int[] arr = {1, 2, 3};
System.out.println(arr.length()); // エラー: length はプロパティでメソッドではない
正しくは:
System.out.println(arr.length); // カッコ不要
3. 拡張for文で要素を変更しようとする
int[] arr = {1, 2, 3};
for (int x : arr) {
x = x * 2; // 配列の中身は変わらない
}
正しくは:
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2;
}
まとめ
| 項目 | 内容 |
|---|---|
| 宣言 | int[] arr = new int[5]; または int[] arr = {1, 2, 3}; |
| アクセス | arr[0](0始まり) |
| 長さ | arr.length(プロパティ) |
| 走査 | 通常for(変更可)、拡張for(読み取り専用) |
- 配列は固定長で、作成後にサイズ変更不可
- インデックスは0から始まる
- 範囲外アクセスは例外が発生
- 二次元配列は
int[][]で宣言
次のステップ
Java入門 #11 - メソッドの定義と呼び出し で処理をまとめるメソッドを学びます。