導入:なぜ配列の比較は難しいのか?
Javaでプログラミングをしていると、「2つの配列の中身が同じか?」を確認したい場面によく遭遇します。しかし、初心者がやりがちな「配列変数1 == 配列変数2」という書き方では、メモリ上のアドレスが同じか比較されるだけで、中身が一致しているかは判定できません。
従来はfor文でループを回して要素を一つずつ比較していましたが、コードが冗長になりがちでした。Java 9で導入された Arrays.compare() と Arrays.mismatch() を使うことで、この課題を一行で、かつ高速に解決できます。現場でコードの可読性を高めるために、ぜひマスターしておきましょう。
基礎知識:Arraysクラスの比較メソッド
Javaの java.util.Arrays クラスには、配列操作に役立つ便利なメソッドが詰まっています。今回紹介する2つは、以下のような違いがあります。
Arrays.compare(): 2つの配列を辞書順で比較します。結果として「0(一致)」「負の値(第1配列が小さい)」「正の値(第1配列が大きい)」のいずれかを返します。
Arrays.mismatch(): 2つの配列を比較し、最初に「不一致が生じたインデックス(位置)」を返します。完全に一致している場合は-1を返します。
これらはintやStringなど、多くの型に対応しています。
実装と解決策
比較ロジックを自分で書く必要はありません。ライブラリが提供するこれらのメソッドを呼び出すだけで、 nullチェックや境界値判定も含めて安全に比較が行えます。特に重要なのは、自作のループ処理よりも最適化されているため、動作が高速であるという点です。
サンプルプログラム
以下のコードをコピーして、ご自身の環境で動作を確認してみてください。
import java.util.Arrays;
public class ArrayComparisonExample {
public static void main(String[] args) {
int[] arrayA = {1, 2, 3, 4};
int[] arrayB = {1, 2, 3, 5};
int[] arrayC = {1, 2, 3, 4};
// 1. Arrays.compare() の使用例
// 戻り値が0なら完全一致、そうでなければ大小関係を示す
int compareResult = Arrays.compare(arrayA, arrayB);
System.out.println(“AとBの比較結果: ” + compareResult); // arrayAの方が小さいため負の値
// 2. Arrays.mismatch() の使用例
// 不一致の箇所(インデックス)を特定する
int mismatchIndex = Arrays.mismatch(arrayA, arrayB);
System.out.println(“AとBの不一致箇所: インデックス ” + mismatchIndex); // インデックス3で不一致
// 3. 一致確認の例
if (Arrays.compare(arrayA, arrayC) == 0) {
System.out.println(“AとCは完全に一致しています!”);
}
}
}
応用・注意点:現場で陥りやすい罠
現場で使う際に注意すべき点は、多次元配列の扱いです。これらのメソッドは1次元配列の比較には最適ですが、2次元配列(配列の配列)を比較する場合には、内部の配列まで含めて比較する別のメソッドが必要になる場合があります。
また、nullの扱いにも注意が必要です。もし比較対象の配列自体がnullである場合、これらのメソッドはNullPointerExceptionをスローします。実務では、比較の前に「if (a != null && b != null)」のようなガード句を入れるか、Optionalを活用して安全性を担保するのがシニアエンジニアの流儀です。
「とりあえずfor文で回す」という癖を卒業して、Javaの標準ライブラリを最大限に活用し、シンプルで堅牢なコードを書いていきましょう。

コメント