二等「===」とequalsの違いを徹底的に理解し、面接は二度と穴に入らない
18969 ワード
≪基本データ型|Basic Data Type|oem_src≫:基本データ型には参照オブジェクトがないため、「==」の効果は比較値が同じかどうかであり、基本データ型にはequalsメソッドはありません.
参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか
なぜ私たちはネット上で「双等比較引用、equals比較値」と言うのを見ることができますか?
それはequalsが書き換えられたためであり,書き換え後の効果は比較値が等しいかどうかであり,それらの例はStringタイプ間で比較され,String内部ではequalsメソッドがデフォルトで書き換えられているため,以上の説がある.
以下にequalsのソースコードを示すが,equalsの内部実装は"="であることがわかる.
String内部書き換えequalsのソースコードは次のとおりです. String内部でequalsメソッドが書き換えられ、書き換え後の効果は2つのオブジェクトの値が等しいかどうかを比較することである .
参照データ型については、次のように記述できます. equalsが書き換えられていない場合、2つの比較は同じ である. equalsが書き換えられた場合、2つの比較は自然に異なる である. String内部のデフォルトではequalsメソッドが書き換えられているため、"=="比較参照、equals比較値 Stringテスト
("=="比較参照,equals比較値)
2つの値が同じ文字列を直接定義して比較
文字列を作成すると、文字列バッファが作成されます.
str 1を作成する場合は、文字列定数プールで「hello」に対応するオブジェクトがあるかどうかを探し、ない場合は1つを作成し、str 1オブジェクトを文字列定数プールに入れ、str 1の値「hello」を定数プールに入れます.
JDK 1.7後:文字列定数プール参照、定数プール値保存
str 2を作成する場合は、まず文字列定数プールで「hello」に対応するオブジェクトがあるかどうかを探します.str 1の対応する値は、自分が作成する文字列の値と同じであることがわかり、str 1が参照するオブジェクトを直接参照します.
だから str 1=str 2:両方が参照するオブジェクトは同じで、「hello」です. str 1.equals(str 2)も同じです.両方の値は同じ です.
2つの値の異なる文字列を直接定義して比較両者が参照するオブジェクトは異なるのでstr 1==str 2はfalse に違いない両者の値も異なるので、以下もfalse new 2つの値が同じ文字列を比較する
newオブジェクトの場合、文字列バッファから探すのではなく、新しいオブジェクトを作成するために直接新しい空間を開き、作成したオブジェクトも定数プールに追加されません.
だから newは2つのオブジェクトを含み、2つのオブジェクトの参照は必ず同じではなく、2等の比較はfalse である.ただし、2つのオブジェクトの値は同じであり、いずれも「Hello」であるため、equalsの比較は同じtrue である.
new 2つの値の異なる文字列を比較する newは2つのオブジェクトを含み、2つのオブジェクトの参照は必ず同じではなく、2等の比較はfalse である.両オブジェクトの値も異なるため、equalsの比較がfalse と異なる.
1つの文字列を直接定義し、new 1つの文字列を比較します(両方の値は同じです). str 2 newは新しいオブジェクトであるためstr 1の参照とは同一ではなく、二等の比較はfalse である.ですが、両者の値は同じなので、equalsの比較はtrue です.
1つの文字列を直接定義しnew 1つの文字列と比較する(両者の値が異なる) str 2 newは新しいオブジェクトであるためstr 1の参照とは同一ではなく、二等の比較はfalse である.は両者の値が異なるためequalsの比較もfalse である.
その他のオブジェクトテスト
("=="比較参照、equalsも参照)
まず、エンティティークラスを作成します.
new 2つの値が同じオブジェクト equalsは書き換えられていないので、両方の比較は同じでfalse です.
new 2つの値が異なるオブジェクト equalsは書き換えられていないため、両方の比較は比較参照が同じかどうかであり、オブジェクトの値とは無関係であるためfalse である.
まとめ
≪基本データ型|Basic Data Type|oem_src≫:基本データ型には参照オブジェクトがないため、「==」の効果は比較値が同じかどうかであり、基本データ型にはequalsメソッドはありません.
参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか equalsメソッドは、 を書き換えることができる. String内部のデフォルトはequalsメソッドを書き換え、両者の値が等しいかどうかを判断する に効果を与える.文字列を作成すると、 文字列定数プールで検索されます.
参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか
なぜ私たちはネット上で「双等比較引用、equals比較値」と言うのを見ることができますか?
それはequalsが書き換えられたためであり,書き換え後の効果は比較値が等しいかどうかであり,それらの例はStringタイプ間で比較され,String内部ではequalsメソッドがデフォルトで書き換えられているため,以上の説がある.
以下にequalsのソースコードを示すが,equalsの内部実装は"="であることがわかる.
public boolean equals(Object obj) {
return (this == obj);
}
String内部書き換えequalsのソースコードは次のとおりです.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
参照データ型については、次のように記述できます.
("=="比較参照,equals比較値)
2つの値が同じ文字列を直接定義して比較
String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
文字列を作成すると、文字列バッファが作成されます.
str 1を作成する場合は、文字列定数プールで「hello」に対応するオブジェクトがあるかどうかを探し、ない場合は1つを作成し、str 1オブジェクトを文字列定数プールに入れ、str 1の値「hello」を定数プールに入れます.
JDK 1.7後:文字列定数プール参照、定数プール値保存
str 2を作成する場合は、まず文字列定数プールで「hello」に対応するオブジェクトがあるかどうかを探します.str 1の対応する値は、自分が作成する文字列の値と同じであることがわかり、str 1が参照するオブジェクトを直接参照します.
だから
2つの値の異なる文字列を直接定義して比較
String str1 = "hello";
String str2 = "hi";
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // false
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
newオブジェクトの場合、文字列バッファから探すのではなく、新しいオブジェクトを作成するために直接新しい空間を開き、作成したオブジェクトも定数プールに追加されません.
だから
new 2つの値の異なる文字列を比較する
String str1 = new String("Hello");
String str2 = new String("Hi");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // false
1つの文字列を直接定義し、new 1つの文字列を比較します(両方の値は同じです).
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
1つの文字列を直接定義しnew 1つの文字列と比較する(両者の値が異なる)
String str1 = "Hello";
String str2 = new String("Hi");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // false
その他のオブジェクトテスト
("=="比較参照、equalsも参照)
まず、エンティティークラスを作成します.
class Person {
private int id;
public Person(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
new 2つの値が同じオブジェクト
Person person1 = new Person(12);
Person person2 = new Person(12);
System.out.println(person1 == person2); // false
System.out.println(person1.equals(person2)); // false
new 2つの値が異なるオブジェクト
Person person1 = new Person(12);
Person person2 = new Person(25);
System.out.println(person1 == person2); // false
System.out.println(person1.equals(person2)); // false
まとめ
≪基本データ型|Basic Data Type|oem_src≫:基本データ型には参照オブジェクトがないため、「==」の効果は比較値が同じかどうかであり、基本データ型にはequalsメソッドはありません.
参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか