【Java Silver試験対策】同一性と同値性の違いを理解しよう

同一性・・・同じオブジェクトであること。「==」で判定します。
同値性・・・同じ値であること。「equals()メソッド」で判定します。

同一ならば同値ですが、同値であっても同一とは限りません。

String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = s1;

// 同一性を判定します
System.out.println(s1 == s2); // false (異なるオブジェクトなので falseになります)
System.out.println(s1 == s3); // true (同じオブジェクトの参照を持つので trueになります)

// 同値性を判定します
System.out.println(s1.equals(s2)); // true (異なるオブジェクトですが、同じ値なので trueになります)
System.out.println(s1.equals(s3)); // true (同じオブジェクトは必然的に値も同じになるので trueになります)

equals()メソッドについて

上で見たように、同値性を判定するためのメソッドです。例えば、

a.equals(b);

の場合、変数a,bがどんな値を持っているかを調べ、等しいならtrue、異なるならfalseを返します。

注意点として、実際にequals()メソッドを使う場合は、開発者が再定義する必要があります。なぜなら、Objectクラスに定義されているequals()メソッドは「==」演算子と同じ役割しか持たず、同一性の判定しかできません。上の例では、equals()メソッドの再定義はおこなっていませんが、同値性の判定ができています。その理由は、Stringクラスではequals()メソッドが再定義されているからです。