1)==の場合、値が等しいかどうかを比較します
- 基本データ型の場合、格納されている「値」のサイズが等しいかどうかが比較されます。
- 参照型の変数に作用する場合、ポイントされたオブジェクトのアドレスが比較されます
2)equalsメソッドの場合、equalsメソッドは基本データ型の変数に適用できないことに注意してください。EqualsはObjectクラスを継承し、それが同じオブジェクトかどうかを比較します。書き換えられていない
equals()メソッド:
public boolean equals(Object obj) {
return (this == obj);
}
equalsメソッドが書き換えられない場合、参照型の変数が指すオブジェクトのアドレスが比較されます。
StringやDateなどのクラスがequalsメソッドを書き換えると、ポイントされたオブジェクトのコンテンツが比較されます。
小さなプログラムを見てみましょう:
package test;
public class student{
String name;
int age;
boolean sex;
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj instanceof student){
student student=(student)obj;
if(this.name.equals(student.name)&&this.age==student.age&&this.sex == student.sex){
return true;
}
}
return false;
}
}
package test;
public class test {
public static void main(String[] args) {
student p1 = new student();
p1.name="a";
p1.age=10;
p1.sex=false;
student p2 = new student();
p2.name="a";
p2.age=10;
p2.sex=false;
System.out.println(p1.equals(p2));
}
}
出力結果:true、ここでは、equals()を書き換えて、studentの3つの属性値を比較します。3つの属性が同じである限り、2つのオブジェクトは等しいと考えます。書き換えられない場合、equals()はオブジェクトのメモリを判断しますアドレス値は明らかに要件を満たしていません。
簡単なメモリ図を見てみましょう。
それらが同じオブジェクトでない限り、それらのすべての属性が同じであっても、それらがメモリに格納するアドレスは矛盾している必要があります。そのため、オブジェクトを比較するときは通常、equals()を書き換える必要があります。そうでない場合、比較は意味がありません。