9
6

More than 3 years have passed since last update.

同一性/同値性

Last updated at Posted at 2019-12-16

個人的なメモです

概要

・同じインスタンスであることを同一、同じ値であることを同値という
・複数の変数が同じインスタンスを参照している性質のことを同一性
・同一性は==演算子で判定
・インスタンスは異なるけど、同じ値を持っていることを同値性
・参照先にあるインスタンスが同じ値を持っているか判定するにはequalsメソッドを使う

注意点

・equalsメソッドは、Objectクラスに定義されている同値性を確かめるためのメソッド
ただし、Objectクラスに定義されているequalsメソッドは、次のように同一性を確認する実装になっている

Sample.java
public boolean equals(Object obj) {
    return (this==obj);
}

・「同じ値を持っている」という定義は、すべてのフィールドが一致することを条件とするのか、それとも一部のフィールドでも一致すればよいと判断するのかがクラスごとに異なるため、どのような条件にするのかを定め、equalsメソッドをオーバーライドすることを前提とする

 ※オーバーライドするときには、null以外の参照値xについて、x.equals(null)はfalseを返すという条件があるで注意

・コード中に同じ文字列リテラルが登場した場合、同じStringインスタンスへの参照が使いまわしされる。このような仕組みをコンスタントプールという。そのため、==演算子を使って同一性を判定すると、trueになる

Sample.java
public class Sample {
    public static void main(String[] args) {
        String a ="sample";
        String b ="sample";
        System.out.println(a==b);//実行結果はtrue
    }
}

new演算子を使って明示的に新しいインスタンスを生成したときは、それぞれの変数が異なる参照を持つ
次のコードは変数aにはインスタンス用のメモリ空間に作られたStringインスタンスへの参照、変数bにはコンスタントプールによって定数用のメモリ空間に作られたStringインスタンスへの参照が代入されるので、==演算子の結果はfalseを返す

Sample.java
public class Sample {
    public static void main(String[] args) {
        String a=new String("sample");
        String b ="sample";
        System.out.println(a==b);//実行結果はfalse
    }
}
9
6
0

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
9
6