==と等しいの違い
==比較は値です。
比較が基本データタイプの場合、比較は可変値です。
比較が参照データタイプの場合、比較はアドレス値です。
Equalsは、参照データタイプを比較します
。hashCodeメソッドとequalsメソッドがオーバーライドされていない場合、アドレス値が比較されます。Objectのequalsメソッドで使用されているためです。
hashCodeとequalsメソッドをオーバーライドする場合は、書き直されたルールを比較してください。
例:2つの文字列文字列が比較される場合:コンテンツが比較されます。Stringの最下層は、コンテンツを比較するためにequalsメソッドを書き換えるためです。
==番号
public class TestEq {
public static void main(String[] args) {
// 1 == 比较的是值
// 1.1 基本数据类型:数值
int a = 1;
int b = 1;
System.out.println( a == b ); //true
// 1.2 引用数据类型:地址值
Student s1 = new Student();
Student s2 = s1;
System.out.println( s1 == s2 ); //true
Student s3 = new Student();
System.out.println(s2 == s3); //false
}
}
@Data
class Student {
private String name;
}
デフォルトに等しい
public class TestEq2 {
public static void main(String[] args) {
// 2 equals
Student2 s1 = new Student2();
Student2 s2 = s1;
Student2 s3 = new Student2();
// Object.equals方法,默认使用 ==
System.out.println( s1.equals(s2) ); //true
System.out.println( s2.equals(s3) ); //false
}
}
class Student2 {
private String name;
}
書き換えは等しい
public class TestEq2 {
public static void main(String[] args) {
// 2 equals
Student2 s1 = new Student2("jack"); // 空、"rose"
Student2 s2 = s1;
Student2 s3 = new Student2("jack"); // 空
// Object.equals方法,默认使用 ==
System.out.println( s1.equals(s2) ); //true
System.out.println( s2.equals(s3) ); //true
}
}
class Student2 {
private String name;
public Student2() {
//无参构造
}
public Student2(String name) {
//有参构造
this.name = name;
}
//name如果相同返回true
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student2 student2 = (Student2) o;
return name != null ? name.equals(student2.name) : student2.name == null;
}
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
}
HashCode()とequals()の関数と違い
機能:hashCode()メソッドはequals()メソッドと同じ機能を持ち、2つのオブジェクトが等しいかどうかを比較します。
違い:
- equals()は、コンテンツの多いオブジェクトを比較し、より包括的で、時間がかかり、効率が低下します。絶対的に信頼できる
equals()2つのオブジェクトが等しい場合、hashCode()は等しくなければなりません。 - hashCode()は1つのハッシュ値のみを比較し、効率が高く、
hashCode()が等しい2つのオブジェクトは信頼できず、equal()は必ずしも等しいとは限りません。
比較の原則:
最初に比較する
- hashCode()が同じでない場合、2つのオブジェクトは同じではありません
- hashCode()が同じ場合、比較は等しい
目的:効率を大幅に向上させるだけでなく、比較の絶対的な正確性を確保することもできます