Javaで同一性と同値性について調べてみたのでまとめてみました。
同値性と同一性の違い
配列、もしくは変数に同じ値かどうかを調べるのか、同じインスタンスで生成されたかどうかを調べるのか
が違います。
配列、もしくは変数に同じ値が入るかどうかを調べるのが同値性
同じインスタンスで生成されたかどうかを判定するのが同一性です。
ここでポイントになるのは、同値性は同じインスタンスで生成されているかいないかは関係ありません。インスタンスを仮にまたいだとしても、同じ値が格納されているのかどうかで判定します。
同値性と同一性はどうやって判定するのか
同値性はequals
同一性は==
で判定します。
サンプルコード
試しに同値性と同一性を判定してみましょう。
class Main {
public static void main(String args[]){
Integer a = 127;
Integer b = 127;
//変数aと変数bの同一性の判定をする
Boolean judge =
a == b;
System.out.println("同値性の判定" + a.equals(b));
System.out.println("同一性の判定" + judge);
System.out.print(a);
}
}
このようにしてequals
と==
を判定すると、出力結果は
同値性の判定true
同一性の判定true
となります。
同一性の判定ではa,bがtrueになるのはわかるのですが、IntegerはIntegerオブジェクトなので宣言して呼び出されているたびにインスタンスが生成されているはずなのです。しかし、同一性の判定でtrueになるのはなぜでしょうか。
それは、
「Java側が無駄にインスタンスを生成してメモリを無駄に食わないように、インスタンスを生成するということを開発者が宣言しない限り、ある程度までは同じインスタンスの値(同一性がある)という判定がされる」
からです。
この「ある程度」というところがポイントです。
この範囲は、
127までです。
試しに、変数aと変数bの値を128にしてみます。これまで通り考えるのであれば、同一性の判定はtrue
になります。
class Main {
public static void main(String args[]){
Integer a = 128;
Integer b = 128;
//変数aと変数bの同一性の判定をする
Boolean judge =
a == b;
System.out.println("同値性の判定" + a.equals(b));
System.out.println("同一性の判定" + judge);
System.out.print(a);
}
}
しかし、128に両方の変数の値が変わってしまうと
同値性の判定true
同一性の判定false
となります。