参照型変数が同じかどうか比較する


参照型変数に対して、同じかどうかを比較する時に、比較する点が2種類あります。
1つはオブジェクトが同一か否か、つまり変数が同一のオブジェクトへの参照を保有しているかどうかの比較です。
もうひとつは、2つのオブジェクトが持つ値が同じ値であるかどうかの比較です。

==を使って比較した場合、オブジェクトが同一であるか、否かが比較され、
equals methodを使って比較した場合、値が同一であるかどうかが比較されます。
ただし、equals methodはObject classから継承し、オーバーライドされるため、classによっては異なる可能性があります。




class ExamEquals1 {
    public static void main(String args[])  {
        Integer  int1   =  new Integer(7);
        Integer  int2   =  new Integer(7);
        Integer  int3   =  int1;
        Long     long1  =  new Long(7);
    // compare  by  ==
        if(int1 == int2)  {
                 @
           System.out.println("int1  equal  int2");
        } else {
           System.out.println("int1  not equal  int2");
        }
        if(int1 == int3)  {
                 A
           System.out.println("int1  equal  int3");
        } else {
           System.out.println("int1  not equal  int3");
        }
    // compare  by equals()  method
        if  (int1.equals(int2)) {
                     B
           System.out.println("int1  equal  int2");
        } else {
           System.out.println("int1  not equal  int2");
        }

        if(int1.equals(long1))  {
                     C
           System.out.println("int1 equal long1");
        } else {
           System.out.println("int1 not equal long1");
        }
    }
}

<実行結果>
コンソールに

int1 not equal int2
int1 equal int3
int1 equal int2
int1 not equal long1

と表示されます。

@ int1とint2はそれぞれにnewでオブジェクトを作成しているので、同一オブジェクトへの参照を持ちません。
よってint1 not equal int2。
A int3はint1を代入して作成しています。参照型変数を代入しても別オブジェクトは生成されません。
int3はint1と同一オブジェクトへの参照を持ちます。よってint1 equal int3。
B ==による比較では、not equalでしたが、この場合は内容の値を比較していますから、どちらも7です。
よってint1 equal int2
C この場合値はどちらも7であるのですが、not equalの判定になっています。
Integer classのequal methodは、その値に関係無く、型が異なる場合はnot equalになります。
つまり、Long型とInteger型の比較は無条件にnot equal(false)です。
他の数値wrapper classも同様だと考えられます。



*ただし、equals methodはObject classから継承し、オーバーライドされるため、classによっては異なる可能性があります。
  例えば、Object classのequals methodは、同一オブジェクトであるかどうかを比較しています。