1. 導入: なぜ今さら「配列」を見直すのか
Javaの現場において、配列は最も基本的なデータ構造ですが、安易に使用するとコードの可読性を下げたり、予期せぬバグ(ArrayIndexOutOfBoundsExceptionなど)を引き起こす原因になります。特に、モダンなJava開発ではListやStream APIの使用が推奨されますが、パフォーマンスがシビアな基盤処理や、固定長のデータを扱う際には依然として配列が不可欠です。本記事では、配列の基本を押さえつつ、現代的なJava開発における「使いどころ」を解説します。
2. 基礎知識: 配列の仕組みと宣言方法
配列は、同じデータ型の値をメモリ上に連続して確保する構造体です。Javaにおける標準的な宣言と初期化は以下の通りです。
Type[] name = new Type[size];
ここで重要なのは、配列は一度サイズを決定すると後から変更できない「固定長」であるという点です。また、初期化時に指定した型に応じたデフォルト値(数値型なら0、参照型ならnull)で埋められるという特性があります。
3. 実装/解決策: 配列の初期化テクニック
配列を扱う際、要素を一つずつ代入するのは非効率です。Javaでは、宣言と同時に値を代入する「配列初期化子」を使用するのが一般的です。
4. サンプルプログラム
以下のコードは、実務でよく遭遇する「配列の初期化」と、それをListへ変換して扱う際の定石です。
import java.util.Arrays;
import java.util.List;
public class ArrayExample {
public static void main(String[] args) {
// 1. 基本的な宣言と初期化(サイズ指定)
int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 100;
// 2. 配列初期化子を用いた簡潔な記述
String[] fruits = {"Apple", "Banana", "Orange"};
// 3. 実務でのテクニック:配列をリストへ変換してStream処理を行う
// Arrays.asListを使うと、Listの便利メソッド(filterやmap等)を活用できる
List fruitList = Arrays.asList(fruits);
fruitList.stream()
.filter(f -> f.startsWith("A"))
.forEach(System.out::println); // Appleが出力される
// 注意点:Arrays.asListで作成したリストは固定サイズであるため、
// 要素の追加・削除を行う場合は new ArrayList<>(Arrays.asList(...)) とする
}
}
5. 応用・注意点: 現場で役立つ教訓
現場のコードレビューでよく見かける注意点を3つ挙げます。
・配列かListかの判断基準:
要素数が実行時に変動する可能性がある場合は、迷わず ArrayList を使用してください。配列は「データ数が固定されていること」が仕様上の要件である場合のみ採用しましょう。
・レコード(Records)との併用:
データ保持が目的であれば、配列で複雑な構造を作るのではなく、Java 14で導入された「レコード(Record)」を検討してください。例えば、複数の属性を持つオブジェクトを配列に詰め込むよりも、レコードのリストとして保持する方が、型安全かつ可読性が格段に向上します。
・NullPointerExceptionの回避:
配列を返すメソッドを実装する場合、要素が空であってもnullを返すのは避けましょう。呼び出し元で必ずNullチェックが必要になり、バグの温床になります。空の場合は「要素数0の配列」を返すのがJavaのベストプラクティスです。
配列はJavaの基礎ですが、その特性を理解して適切に使い分けることが、堅牢なシステムを作る第一歩となります。

コメント