同一性と同値性とは
いきなりですが、下記のコードを実行したときコンソールに何が出力されるでしょうか?
public class Main {
public static void main(String[] args) {
String a = "hello";
String b = new String("hello");
System.out.println(a == b);
System.out.println(a.equals(b));
}
}
正解は下記です。
false
true
これが同一性と同値性の違いになります。詳しく解説していきます。
同一性とは
結論から述べると、同一性は「オブジェクトが同じメモリアドレスを指しているかどうか」で判定されます。同一性を判定する時は「==」を使います。
上記のコードの例だと変数bはnew Stringを明示的に記載しているため変数aとは異なるメモリの参照を持ちます。そのため判定した結果は「false」になると言うわけです。
同値性とは
同値性は「オブジェクトが同じ値を持っているかどうか」で判定されます。同値性を判定するときは「Stringクラスのequalsメソッド」を使用します。
上記のコード例だと変数aとbはどちらも「hello」という値を持っているため等しいと判定されtrueが返されます。