配列の基本
このレッスンで分かること
- 配列は同じ型の値を並べて入れる箱、
int[] arr = {1, 2, 3};の形で作ります- 長さは
arr.length(カッコなし)、インデックスは 0 始まり- 最小例は
int[] arr = {10, 20, 30}; int first = arr[0];
配列の基本 とは
Java の配列の宣言、長さの取り方、インデックスでの要素アクセスを学び、最初の要素を返すメソッドを書いてみよう。
配列とは
プログラムを書いていると、1 つの変数 ではなく たくさんの値をまとめて 扱いたい場面が必ず出てきます。たとえばクラスの生徒の点数、商品の価格、1 週間の最高気温など、同じ種類の値が複数並ぶ データはどこにでも転がっています。
そんなときに Java で最初に登場するのが 配列 (array) です。配列は 同じ型の値を並べて入れる箱 のような存在で、int の箱なら int だけ、String の箱なら String だけ、同じ型 の値を一列に並べてしまっておくことができます。
配列は
Javaだけでなく、CC++PythonJavaScriptといったほぼすべての言語にある基本中の基本のデータ構造です。一度マスターすれば他の言語に移ったときもすぐ応用が利くので、ここでしっかり手に馴染ませておきましょう。
たとえば 5 人分のテストの点数を 1 つずつ別の変数に入れると、int score1 = 80; int score2 = 65; ... と 5 行も書く羽目になります。これが 100 人になると現実的ではありません。配列を使えば int[] scores = {80, 65, 92, 71, 88}; の 1 行 で済みます。
配列の宣言
まずは一番素直な書き方を見てみましょう。配列を宣言するには、型名 の後ろに [] を付け、続けて 波カッコ {} で初期値を並べます。
Java
int[] arr = {1, 2, 3};
String[] fruits = {"apple", "banana", "cherry"};
double[] prices = {100.5, 200.0, 350.25};int[]—int型の値を入れる配列、という型宣言arr— 配列の名前 (普通の変数と同じ){1, 2, 3}— 初期値の一覧。カンマ区切りで並べる
もうひとつ、サイズだけ先に決めて中身は後で埋める書き方もあります。
Java
int[] empty = new int[5];これは int を 5 個入れられる配列を作る書き方で、中身は 自動的に 0 で初期化されます (参照型なら null、boolean なら false)。すでに値が決まっているなら {...} 形式、後で計算結果を入れたいなら new int[N] 形式、というように使い分けます。
配列を
Javaで宣言するときはint[] arrとint arr[]の 2 通りの書き方ができます。どちらも文法的には合法ですが、Javaの現代的な書き方では 型名の後ろに[]を付けるint[] arrのスタイルが推奨されています。
配列の長さ
配列に何個入っているかを知りたいときは、配列名.length を使います。これは メソッド呼び出しではなく、フィールド (プロパティ) アクセス であることに要注意です。
Java
int[] arr = {10, 20, 30, 40};
System.out.println(arr.length); // 4arr.length の後ろに () を 付けません。String の長さは s.length() とメソッド呼び出しなのに、配列は arr.length とプロパティアクセス、という地味に混乱するルールが Java にはあります。最初は誰もが引っかかるので、配列だけは .length にカッコなし と呪文のように覚えてください。
| 対象 | 長さの取り方 | カッコ |
|---|---|---|
配列 arr | arr.length | なし |
文字列 s | s.length() | あり |
List<T> | list.size() | あり |
なぜこんな違いがあるのかというと、
Javaの配列は言語組み込みの特別なオブジェクトで、lengthという公開フィールドを持つように設計されているからです。一方Stringは普通のクラスで、内部の文字数はlength()メソッド経由でしか取れません。深入りせずに配列 = カッコなしと暗記してしまうのが早いです。
0 始まりのインデックス
配列の中の要素にアクセスするには インデックス (添字) を使います。ここで最大の注意点は インデックスが 0 から始まる ということです。
Java
int[] arr = {10, 20, 30};
System.out.println(arr[0]); // 10 (最初の要素)
System.out.println(arr[1]); // 20
System.out.println(arr[2]); // 30 (最後の要素)配列の長さが 3 なら、有効なインデックスは 0 1 2 の 3 つだけです。arr[3] にアクセスすると ArrayIndexOutOfBoundsException という実行時エラーになり、プログラムが落ちます。
つまり最初の要素は arr[0]、最後の要素は arr[arr.length - 1] です。arr.length 自体は要素数で、最後の要素のインデックス + 1 であることをしっかり押さえましょう。
図の対応を箇条書きにまとめると、次の通りです。
- 配列
arr = {10, 20, 30, 40}は長さ 4 arr[0]は10(先頭)arr[1]は20arr[2]は30arr[3]は40(末尾)arr[arr.length](=arr[4]) は範囲外で例外
この図のように、配列はメモリ上で インデックス 0 から順番に並ぶ箱 のイメージです。arr.length は箱の総数を、arr[i] は i 番目の箱の中身を指しています。
空配列という特殊ケース
配列は中身が 0 個 の場合もあります。これを 空配列 と呼びます。int[] empty = {}; や new int[0] のように作れます。
Java
int[] empty = {};
System.out.println(empty.length); // 0空配列に対して empty[0] とアクセスすると当然エラーになります。要素が 1 つもないので、取り出せる先頭要素も存在しません。今回の課題のように 空配列が来たらどうする? という分岐を入れるのは、配列を扱うコードの定番パターンです。
空配列と
nullは別物です。int[] arr = null;は配列が そもそも存在しない という状態で、arr.lengthを呼ぶとNullPointerExceptionで落ちます。一方int[] arr = {};は配列はある、ただし要素が 0 個という状態です。実務では 空配列を返すほうが安全 とされることが多いので、頭の片隅に入れておきましょう。
完成形のコード例
ここまでの知識で、配列の先頭要素を返すメソッドはこう書けます。
Java
public class Solution {
public static int firstElement(int[] arr) {
if (arr.length == 0) {
return 0;
}
return arr[0];
}
}if (arr.length == 0) で空配列をはじいて 0 を返し、それ以外は arr[0] を返すだけ、というシンプルな構造です。arr.length の カッコなし と arr[0] の 0 始まり、この 2 つさえ覚えていれば書けてしまいます。
別解として、三項演算子 でワンライナーにする書き方もあります。
Java
public class Solution {
public static int firstElement(int[] arr) {
return arr.length == 0 ? 0 : arr[0];
}
}読みやすさはお好みですが、if 文と完全に同じ意味です。
よくある間違い
配列で初学者がハマるポイントは、ほぼ次の 3 つに集約されます。
- 1 始まりと勘違いする — 数学やスプレッドシートに慣れていると、最初の要素を
arr[1]と書きたくなります。Javaのインデックスは0始まりなので、最初はarr[0]、最後はarr[arr.length - 1]です。arr[arr.length]と書くと off-by-one エラー でArrayIndexOutOfBoundsExceptionになります lengthをメソッド呼び出しで書く —arr.length()と書きたくなりますが、配列のlengthは プロパティ なのでカッコは付けません。Stringのs.length()(カッコあり) との違いが地味に厄介で、コンパイラにcannot find symbolと怒られたら大抵これです- null チェックを忘れる —
int[] arr = null;の状態でarr.lengthやarr[0]を触ると、即NullPointerExceptionで落ちます。引数で受け取る配列は、信頼できないならif (arr == null)のチェックを先に入れる癖をつけましょう
もうひとつ、配列の比較で arr1 == arr2 と書くと 中身ではなく参照 を比較してしまうという罠もあります。中身を比べたいときは java.util.Arrays.equals(arr1, arr2) を使います。
ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3というエラーが出たら、「長さ 3 の配列に対して、存在しないインデックス 3 を読みに行った」という意味です。
ここまでの要点
配列は同じ型をまとめる箱。長さは arr.length (カッコなし)、インデックスは 0 始まりで最後は arr.length - 1。空配列と null は別物。
やってみよう
それでは今回の課題に挑戦しましょう。手順は次のとおりです。
- 右側のエディタの
firstElementメソッドを完成させる arr.length == 0のときは0を返す- それ以外は
arr[0]を返す - 「実行」ボタンを押してテストが全部緑になることを確認する
pass したら、三項演算子 版に書き換えて同じテストが通るか試したり、firstElement を lastElement に書き換えて末尾要素を返すように変えてみたり、largestElement で for ループと組み合わせて最大値を取り出すように発展させてみたり、自由に遊んでみるのがおすすめです。
配列は次のレッスン以降、for ループとセットでありとあらゆる場面に登場します。 平均、最大、検索、ソート、Java の入門から実務までずっと付き合うことになる相棒なので、ここで 0 始まり length にカッコなし 空配列の扱い の 3 点を体に染み込ませておくと、この先の学習が一気にスムーズになります。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は 配列の要素にアクセス で、Java の配列の宣言、長さの取り方、インデックスでの要素アクセスを学び、最初の要素を返すメソッドを書いてみよう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 配列 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 配列 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はfirstElement、引数はint[] arr1 つ、戻り値の型はintにすること - 配列が空 (
arr.length == 0) のときは0を返すこと - それ以外は
arr[0](先頭要素) を返すこと
入出力例
test-cases.txt
firstElement([10,20,30]) → 10
firstElement([5]) → 5
firstElement([]) → 0
firstElement([-3,7]) → -3