同一性と同値性とは

いきなりですが、下記のコードを実行したときコンソールに何が出力されるでしょうか?

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が返されます。