Beginner's Hack

復習用。誰かのためになれば...

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()を使用する必要があるため注意していきたい。