本ページはプロモーションが含まれています

Java入門

【Java初心者向け】配列の基本を3分で理解!使い方を徹底解説

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

Javaの学習を始めたばかりのころ、多くの人が「配列」という概念でつまずきがちです。私自身、Javaを学び始めたとき、変数に1つの値しか入れられない世界から、急に複数の値を扱える配列が登場し、頭が混乱した経験があります。

しかし、現場で数多くのJavaコードに触れてきた今、断言できることがあります。それは、Javaの配列をきちんと理解することが、その後の上達スピードを大きく左右するということです。

この記事は、以下のような悩みを持つJava初心者の方に向けて書きました。

  • そもそもJavaの配列が何なのかイメージできない
  • 配列の基本的な使い方が分からない
  • for文と配列の組み合わせ方が知りたい

この記事を最後まで読めば、Javaの配列の基礎知識から、実践的な使い方を体系的に理解できます。豊富なコード例とともに、つまずきやすいポイントを丁寧に解説していくので、ぜひあなたの学習に役立ててください。

Javaの配列とは?基本の仕組み

Javaプログラミングにおいて、配列は複数のデータを効率的に扱うための基本的な仕組みです。最初に、配列の概念と基本文法をしっかりと押さえましょう。

配列とは何か?変数との違い

配列とは、同じ型の複数のデータを、連続した箱にまとめて格納する仕組みです。

たとえば、テストの点数を管理したい場合を考えてみましょう。変数の場合、生徒5人分の点数を保存するには、5個の変数が必要です。

int score1 = 80;
int score2 = 95;
int score3 = 70;
int score4 = 88;
int score5 = 92;

これでは、生徒が100人になったら100個の変数が必要になり、管理が非常に大変になります。

一方、配列を使えば、これらの点数を1つのまとまりとして扱えます。

int[] scores = {80, 95, 70, 88, 92};

このように、1つのscoresという名前で、5つの点数データを管理できるようになるのです。これが変数とJava配列の大きな違いです。

Javaで配列が必要になる理由

Javaで配列が必要になる最大の理由は、大量のデータを効率的に処理できるからです。

先ほどのテストの点数の例のように、たくさんのデータを扱いたい場面はプログラミングでは頻繁に登場します。配列を使えば、繰り返し処理(for文など)と組み合わせることで、大量のデータに対する操作をわずか数行のコードで記述できます。

もし配列がなければ、データ1つひとつに対して同じ処理を何度も書く必要があり、コードが長くなるだけでなく、修正も大変でミスも発生しやすくなるでしょう。

配列の宣言と初期化の基本文法

Javaで配列を利用するには、まず「宣言」と「初期化」が必要です。

宣言は、「これからこの名前で、この型の配列を使いますよ」とコンピューターに伝える作業です。

// 構文: 型[] 配列名;
int[] scores; // int型の値を格納するscoresという名前の配列を宣言
String[] names; // String型の値を格納するnamesという名前の配列を宣言

初期化は、配列が実際にいくつのデータを格納できるのか、箱(要素)を確保する作業です。初期化には、大きく分けて2つの方法があります。

1. 要素数を指定して初期化する方法

newキーワードを使い、配列のサイズ(要素数)を指定して作成します。この場合、各要素はデータ型の初期値(intなら0、Stringならnull)で自動的に埋められます。

// 構文: 配列名 = new 型[要素数];
scores = new int[5]; // int型の要素を5つ格納できる配列を作成

もちろん、宣言と初期化は1行で書くことも可能です。

// 構文: 型[] 配列名 = new 型[要素数];
int[] scores = new int[5]; // 宣言と同時に5つの要素を持つ配列を初期化

2. 初期値を指定して初期化する方法

宣言と同時に、{}(波括弧)の中に具体的な値を入れて配列を作成する方法です。この場合、指定した値の数で配列のサイズが自動的に決まります。

// 構文: 型[] 配列名 = {値1, 値2, 値3, ...};
int[] scores = {80, 95, 70, 88, 92}; // 5つの初期値を持つ配列を作成
String[] names = {"田中", "佐藤", "鈴木"}; // 3つの初期値を持つ配列を作成

Javaの配列の使い方

配列の基本的な仕組みを理解したところで、次は具体的な使い方を見ていきましょう。ここでは、要素へのアクセス方法や、配列の長さを取得する方法を解説します。

配列の宣言と代入の書き方

配列の各データ(要素)には、インデックスと呼ばれる番号が割り振られています。このインデックスは0から始まることに注意してください。たとえば、要素数が5の配列の場合、インデックスは0, 1, 2, 3, 4となります。

要素に値を代入するには、配列名[インデックス]の形式で場所を指定します。

// 5人分の点数を格納する配列を作成
int[] scores = new int[5];

// インデックスを使って各要素に値を代入する
scores[0] = 80; // 最初の要素(インデックス0)に80を代入
scores[1] = 95;
scores[2] = 70;
scores[3] = 88;
scores[4] = 92; // 最後の要素(インデックス4)に92を代入

ここでscores[5]のように、存在しないインデックスを指定すると、ArrayIndexOutOfBoundsExceptionというエラーが発生します。これはJava初心者が非常によく遭遇するエラーなので、インデックスは0から始まり、最後のインデックスは「要素数 - 1」であることを必ず覚えておきましょう。

配列の要素を取得・変更する方法

配列の要素に格納された値を取得する場合も、代入と同じようにインデックスを使います。

int[] scores = {80, 95, 70, 88, 92};

// インデックスを指定して要素の値を取得し、出力する
System.out.println(scores[0]); // 実行結果: 80
System.out.println(scores[2]); // 実行結果: 70

// 取得した値を別の変数に代入することも可能
int tanakaScore = scores[0];
System.out.println("田中さんの点数は" + tanakaScore + "点です"); // 実行結果: 田中さんの点数は80点です

一度代入した要素の値を変更(上書き)することもできます。

int[] scores = {80, 95, 70, 88, 92};

System.out.println("変更前の3番目の点数: " + scores[2]); // 実行結果: 変更前の3番目の点数: 70

// インデックス2の要素の値を変更する
scores[2] = 75;

System.out.println("変更後の3番目の点数: " + scores[2]); // 実行結果: 変更後の3番目の点数: 75

配列の長さを取得する「length」プロパティ

配列にいくつの要素が格納されているか(配列の長さ)を取得するには、lengthというプロパティを使います。これは、特に後述するfor文で配列を処理する際に非常に重要になります。

lengthはメソッドではないため、()(丸括弧)は付けずに配列名.lengthのように記述します。

int[] scores = {80, 95, 70, 88, 92};
String[] fruits = {"りんご", "バナナ", "みかん"};

// lengthプロパティで配列の長さを取得する
System.out.println(scores.length); // 実行結果: 5
System.out.println(fruits.length); // 実行結果: 3

配列を使った具体例

ここからは、配列をより実践的に使うための具体例を見ていきましょう。特にループ処理との組み合わせは、Java配列を扱う上での基本中の基本です。

for文を使った配列のループ処理

配列の全ての要素に対して同じ処理を行いたい場合、for文を使うのが一般的です。for文のカウンタ変数(よくiが使われます)を配列のインデックスとして利用します。

配列名.lengthと組み合わせることで、配列の長さが変わってもコードを修正する必要がなくなります。

// 生徒5人分の点数配列
int[] scores = {80, 95, 70, 88, 92};

// for文を使って全ての要素を順番に出力する
// i < scores.length とすることで、iが0から4まで変化する
for (int i = 0; i < scores.length; i++) {
  System.out.println((i + 1) + "番目の点数: " + scores[i]);
}

実行結果:

1番目の点数: 80
2番目の点数: 95
3番目の点数: 70
4番目の点数: 88
5番目の点数: 92

拡張for文(for-each)の使い方

配列の全ての要素に対して、順番に処理を行うだけであれば、よりシンプルに記述できる拡張for文(for-each文とも呼ばれます)が便利です。

拡張for文は、インデックスを意識する必要がないため、コードがすっきりと読みやすくなります。

// 構文: for (型 変数名 : 配列名) { ... }
int[] scores = {80, 95, 70, 88, 92};

// 拡張for文を使って全ての要素を順番に出力する
for (int score : scores) {
  // scores配列から要素が1つずつ取り出され、score変数に代入される
  System.out.println("点数: " + score);
}

実行結果:

点数: 80
点数: 95
点数: 70
点数: 88
点数: 92

ただし、拡張for文では要素のインデックス番号が分からないため、「何番目の要素か」を知りたい場合や、ループ中に要素の値を変更したい場合には、通常のfor文を使う必要があります。

配列を使った平均値や合計の計算例

配列とfor文を組み合わせることで、合計値や平均値の計算も簡単に行えます。

int[] sales = {120, 250, 180, 300, 210, 280, 150}; // 1週間の売上データ
int sum = 0; // 合計値を保存する変数

// 拡張for文で合計値を計算する
for (int sale : sales) {
  sum += sale; // sum = sum + sale と同じ意味
}

// 平均値を計算する (合計 / 要素数)
// double型にキャストしないと、小数点以下が切り捨てられてしまうので注意
double average = (double)sum / sales.length;

System.out.println("合計売上: " + sum); // 実行結果: 合計売上: 1490
System.out.println("平均売上: " + average); // 実行結果: 平均売上: 212.857...

多次元配列を理解しよう

Javaの配列は、1列にデータが並んだ1次元配列だけでなく、行と列を持つ表のような多次元配列も作成できます。ここでは、特によく使われる2次元配列について解説します。

多次元配列の宣言と初期化

2次元配列は、配列の中にさらに配列が入っている構造をしています。エクセルのシートや、碁盤の目をイメージすると分かりやすいでしょう。

宣言や初期化は、[]を2つ続けて記述します。

1. 要素数を指定して初期化する方法

// 構文: 型[][] 配列名 = new 型[行数][列数];
// 3行2列のint型2次元配列を作成
int[][] matrix = new int[3][2];

2. 初期値を指定して初期化する方法

{}の中に、さらに{}で各行の要素を記述します。

// 構文: 型[][] 配列名 = {{1行目の値}, {2行目の値}, ...};
// 3教科、5人分の点数を管理する2次元配列
int[][] testScores = {
  {80, 95, 70, 88, 92}, // 1行目: 国語の点数
  {75, 89, 91, 82, 78}, // 2行目: 数学の点数
  {88, 92, 85, 79, 95}  // 3行目: 英語の点数
};

二重for文でのアクセス方法

2次元配列の全ての要素にアクセスするには、for文を2つ入れ子にした二重for文(ネストしたfor文)を使います。

外側のfor文で行を、内側のfor文で列を操作するのが一般的です。

int[][] testScores = {
  {80, 95, 70, 88, 92},
  {75, 89, 91, 82, 78},
  {88, 92, 85, 79, 95}
};

// testScores.lengthで行数 (3) を取得
for (int i = 0; i < testScores.length; i++) {
  // testScores[i].lengthで各行の列数 (5) を取得
  for (int j = 0; j < testScores[i].length; j++) {
    // System.out.print() は改行しない出力
    System.out.print(testScores[i][j] + " ");
  }
  // 1行分の出力が終わったら改行する
  System.out.println();
}

実行結果:

80 95 70 88 92 
75 89 91 82 78 
88 92 85 79 95 

2次元配列の応用例(表データなど)

2次元配列は、さまざまな場面で活用できます。

  • 座席表: seats[2][4] で3行目の5番目の席の状態(空席か予約済みか)を管理する
  • ゲームのマップ: map[10][10] でフィールドの各マスに地形やキャラクター情報を格納する
  • 画像データ: 各ピクセルの色情報を格納する

このように、行と列で管理したいデータがある場合に、2次元配列は非常に役立ちます。

配列と便利なクラス・メソッド

Javaには、配列操作を助けてくれる便利なクラスやメソッドが標準で用意されています。これらを使いこなすことで、より効率的にプログラミングを進められます。

Arraysクラスでできること(並べ替え・検索など)

java.util.Arraysクラスは、配列を操作するための静的メソッドを提供します。利用するには、ファイルの先頭でimport java.util.Arrays;と記述します。

  • sort(): 配列の並べ替え(ソート)要素を昇順(小さい順)に並べ替えます。import java.util.Arrays; int[] numbers = {50, 20, 80, 10, 40}; Arrays.sort(numbers); // numbersの中身は {10, 20, 40, 50, 80} に変わる
  • binarySearch(): 配列の検索ソート済みの配列から、指定した値のインデックスを高速に検索します。配列がソート済みであることが前提なので注意が必要です。int[] numbers = {10, 20, 40, 50, 80}; // ソート済み int index = Arrays.binarySearch(numbers, 40); // indexは 2 となる
  • equals(): 配列の比較2つの配列の要素が全て同じかどうかを比較します。int[] a = {1, 2, 3}; int[] b = {1, 2, 3}; boolean isEqual = Arrays.equals(a, b); // trueが返される

toString()で配列を文字列に変換する

配列変数をそのままSystem.out.println()で出力しようとすると、[I@...のような意味不明な文字列が表示されてしまいます。これは配列のメモリ上のアドレスを示しているためです。

int[] numbers = {10, 20, 30};
System.out.println(numbers); // 実行結果の例: [I@1b6d3586

配列の中身を分かりやすく文字列として表示したい場合は、Arrays.toString()メソッドを使います。

import java.util.Arrays;

int[] numbers = {10, 20, 30};
System.out.println(Arrays.toString(numbers)); // 実行結果: [10, 20, 30]

System.arraycopy()で配列をコピーする方法

配列のコピーには注意が必要です。=を使って代入すると、配列そのものではなく、配列の場所情報(参照)だけがコピーされます。

int[] original = {1, 2, 3};
int[] copy = original; // これは参照のコピー

copy[0] = 99; // コピーした配列の要素を変更すると...

System.out.println(Arrays.toString(original)); // 実行結果: [99, 2, 3]
// 元の配列まで変わってしまう!

配列の要素を丸ごと新しい別の配列にコピーしたい場合は、System.arraycopy()メソッドを使います。

// 構文: System.arraycopy(コピー元, コピー元開始位置, コピー先, コピー先開始位置, コピーする要素数);
int[] original = {1, 2, 3, 4, 5};
int[] destination = new int[5];

System.arraycopy(original, 0, destination, 0, 5);

destination[0] = 99; // コピー先の配列を変更しても...

System.out.println("コピー元: " + Arrays.toString(original));     // 実行結果: コピー元: [1, 2, 3, 4, 5]
System.out.println("コピー先: " + Arrays.toString(destination)); // 実行結果: コピー先: [99, 2, 3, 4, 5]
// 元の配列は影響を受けない

まとめ|配列の基本をマスターして次のステップへ

今回は、Javaの配列について、基本的な概念から実践的な使い方までを網羅的に解説しました。

配列のポイントおさらい

最後に、この記事で学んだ重要なポイントを振り返りましょう。

  • 配列は、同じ型のデータをまとめて管理するための仕組み。
  • 各要素には0から始まるインデックスが割り振られる。
  • 配列の長さは 配列名.length で取得できる。
  • for文や拡張for文と組み合わせることで、大量のデータを効率的に処理可能。
  • 2次元配列を使えば、表のようなデータも扱える。
  • Arraysクラスには、ソートや検索など便利なメソッドが用意されている。
  • この記事を書いた人
  • 最新記事

トム

・都内自社開発IT企業勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門