Java - 配列の比較(==, equals, deepEquals)
配列の比較方法には、タイトルのように3つの方法がある。
この3つの違いを自分なりにまとめてみたいと思う。
==
参照先を比較する為、見た目の値が一緒でも参照先が異なればfalseとなる。
String[] array1 = {"aaa", "bbb", "ccc" }; // 元の配列を代入 → 値も参照先も同じ String[] asArray1 = array1; // 元の配列をコピー → 値は一緒だが参照先は異なる String[] copyArray1 = Arrays.copyOf(array1, 3); // 元の配列を同じ値を代入 → 値は一緒だが参照先は異なる String[] likeArray1 = {"aaa", "bbb", "ccc" }; System.out.println(array1 == asArray1); /* true */ System.out.println(array1 == copyArray1); /* false */ System.out.println(array1 == likeArray1); /* false */
equals, deepEquals
参照先ではなく、値を比較する。
String[] array1 = {"aaa", "bbb", "ccc" }; String[] asArray1 = array1; String[] copyArray1 = Arrays.copyOf(array1, 3); String[] likeArray1 = {"aaa", "bbb", "ccc" }; // equals System.out.println(Arrays.equals(array1, asArray1)); /* true */ System.out.println(Arrays.equals(array1, copyArray1)); /* true */ System.out.println(Arrays.equals(array1, likeArray1)); /* true */ // deepEquals System.out.println(Arrays.deepEquals(array1, asArray1)); /* true */ System.out.println(Arrays.deepEquals(array1, copyArray1)); /* true */ System.out.println(Arrays.deepEquals(array1, likeArray1)); /* true */
equalsとdeepEqualsの違い
この2つの違いは、多次元配列の比較の際に現れる。
// 二次元配列の場合 String[][] array2 = {{"aaa", "bbb", "ccc" }, {"ddd", "eee", "fff"}}; String[][] asArray2 = array2; String[][] copyArray2 = Arrays.copyOf(array2, 2); String[][] likeArray2 = {{"aaa", "bbb", "ccc" }, {"ddd", "eee", "fff"}}; // == System.out.println(array2 == asArray2); /* true */ System.out.println(array2 == copyArray2); /* false */ System.out.println(array2 == likeArray2); /* false */ // equals // equalsは配列の中の参照先が同じか判断している。 // likeArray2は"配列の中の配列"の参照先が異なるため、falseとなる System.out.println(Arrays.equals(array2, asArray2)); /* true */ System.out.println(Arrays.equals(array2, copyArray2)); /* true */ System.out.println(Arrays.equals(array2, likeArray2)); /* false */ // deepEquals // "配列の中の配列"の値が同じか判断するため、全てtrueとなる。 System.out.println(Arrays.deepEquals(array2, asArray2)); /* true */ System.out.println(Arrays.deepEquals(array2, copyArray2)); /* true */ System.out.println(Arrays.deepEquals(array2, likeArray2)); /* true */
Arrays.copyOf()メソッドで複製した配列であれば問題なさそうだが、全く別の多次元配列の値を比較する際は、deepEquals()を使用する必要があるため注意していきたい。