配列の基本

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 配列は同じ型の値を並べて入れる箱、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 だけでなく、C C++ Python JavaScript といったほぼすべての言語にある基本中の基本のデータ構造です。一度マスターすれば他の言語に移ったときもすぐ応用が利くので、ここでしっかり手に馴染ませておきましょう。

たとえば 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 で初期化されます (参照型なら nullboolean なら false)。すでに値が決まっているなら {...} 形式、後で計算結果を入れたいなら new int[N] 形式、というように使い分けます。

配列を Java で宣言するときは int[] arrint arr[] の 2 通りの書き方ができます。どちらも文法的には合法ですが、Java の現代的な書き方では 型名の後ろに [] を付ける int[] arr のスタイルが推奨されています。

配列の長さ

配列に何個入っているかを知りたいときは、配列名.length を使います。これは メソッド呼び出しではなく、フィールド (プロパティ) アクセス であることに要注意です。

Java

int[] arr = {10, 20, 30, 40}; System.out.println(arr.length); // 4

arr.length の後ろに ()付けませんString の長さは s.length() とメソッド呼び出しなのに、配列は arr.length とプロパティアクセス、という地味に混乱するルールが Java にはあります。最初は誰もが引っかかるので、配列だけは .length にカッコなし と呪文のように覚えてください。

対象長さの取り方カッコ
配列 arrarr.lengthなし
文字列 ss.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 であることをしっかり押さえましょう。

diagram (will load when visible)

図の対応を箇条書きにまとめると、次の通りです。

  • 配列 arr = {10, 20, 30, 40} は長さ 4
  • arr[0]10 (先頭)
  • arr[1]20
  • arr[2]30
  • arr[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プロパティ なのでカッコは付けません。Strings.length() (カッコあり) との違いが地味に厄介で、コンパイラに cannot find symbol と怒られたら大抵これです
  • null チェックを忘れるint[] arr = null; の状態で arr.lengtharr[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 は別物。

やってみよう

それでは今回の課題に挑戦しましょう。手順は次のとおりです。

  1. 右側のエディタの firstElement メソッドを完成させる
  2. arr.length == 0 のときは 0 を返す
  3. それ以外は arr[0] を返す
  4. 「実行」ボタンを押してテストが全部緑になることを確認する

pass したら、三項演算子 版に書き換えて同じテストが通るか試したり、firstElementlastElement に書き換えて末尾要素を返すように変えてみたり、largestElementfor ループと組み合わせて最大値を取り出すように発展させてみたり、自由に遊んでみるのがおすすめです。

配列は次のレッスン以降、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 つができることを確認しましょう。

  1. 配列 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 配列 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は firstElement、引数は int[] arr 1 つ、戻り値の型は int にすること
  2. 配列が空 (arr.length == 0) のときは 0 を返すこと
  3. それ以外は arr[0] (先頭要素) を返すこと

入出力例

test-cases.txt

firstElement([10,20,30])10 firstElement([5])5 firstElement([])0 firstElement([-3,7])-3

ヒント

main.java
main.java
学習モード

メモ

配列の基本

⌘S で保存