##Javaの同一性と同値性の判定
についてまとめました。
【同一・同値とは】
Javaは「同じ」と言う言葉に2つの意味を持っていて
- 同じインスタンスであることを「同一」
- 同じ値であることを「同値」
といいます。
【同一性・同値性とは】
- インスタンスは異なるけど、同じ値を持っていることを同値性
- 複数の変数が同じインスタンスを参照している性質のことを同一性
といいます。
それぞれの判定方法は以下です。
- 同一性は ==演算子
- 参照先にあるインスタンスが同じ値を持っているかはequalsメソッド
【サンプルコード】
以下のコードはこのような流れです。
- mainメソッドでSampleのインスタンスを1つ生成
- Sample型変数をもう一つ用意し、1つ目のインスタンスへの参照を代入
- さらにSampleのインスタンスを生成し、そのインスタンスへの参照をsample1に代入
コメントアウト内に詳しい処理の流れを書きましたが、最終的にsample1とsample2は異なるインスタンスとなるため、結果は「false」になります。
public class Sample {
private int num;
public Sample(int num) {
this.setNum(num);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
public class Main {
public static void main(String[] args) {
// 1. Sampleのインスタンスを1つ生成
Sample sample1 = new Sample(10);
// 2. Sample型変数をもう一つ用意し、1つ目のインスタンスへの参照を代入
Sample sample2 = sample1; // sample1,sample2は「同一」※同じインスタンスであること
// 3. さらにSampleのインスタンスを生成し、そのインスタンスへの参照をsample1に代入
sample1 = new Sample(10);// sample1とsample2は異なるインスタンスへの参照を持っているため「同一」ではなくなる
System.out.println(sample1 == sample2); // 結果false
}
}
false
【まとめ】
Silver対策として・・
- インスタンスは異なるけど、同じ値を持っていることを同値性といい、equalsメソッドで判定。
- 同一性とは、複数の変数が同じインスタンスを参照している性質のことで、==演算子で判定。
ややこしいですが、同名でも新しくインスタンスを生成すれば異なるインスタンスとなると覚えておく。