1
0

More than 1 year has passed since last update.

Javaの同値性と同一性についてまとめてみた

Posted at

Javaで同一性と同値性について調べてみたのでまとめてみました。

同値性と同一性の違い

配列、もしくは変数に同じ値かどうかを調べるのか、同じインスタンスで生成されたかどうかを調べるのか
が違います。

配列、もしくは変数に同じ値が入るかどうかを調べるのが同値性

同じインスタンスで生成されたかどうかを判定するのが同一性です。

ここでポイントになるのは、同値性は同じインスタンスで生成されているかいないかは関係ありません。インスタンスを仮にまたいだとしても、同じ値が格納されているのかどうかで判定します。

同値性と同一性はどうやって判定するのか

同値性はequals

同一性は==で判定します。

サンプルコード

試しに同値性と同一性を判定してみましょう。

Main.java
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になります。

Main.java
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

となります。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0