二等「===」とequalsの違いを徹底的に理解し、面接は二度と穴に入らない

18969 ワード

≪基本データ型|Basic Data Type|oem_src≫:基本データ型には参照オブジェクトがないため、「==」の効果は比較値が同じかどうかであり、基本データ型にはequalsメソッドはありません.
参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか
なぜ私たちはネット上で「双等比較引用、equals比較値」と言うのを見ることができますか?
それはequalsが書き換えられたためであり,書き換え後の効果は比較値が等しいかどうかであり,それらの例はStringタイプ間で比較され,String内部ではequalsメソッドがデフォルトで書き換えられているため,以上の説がある.
以下にequalsのソースコードを示すが,equalsの内部実装は"="であることがわかる.
public boolean equals(Object obj) {
    return (this == obj);
}

String内部書き換えequalsのソースコードは次のとおりです.
  • String内部でequalsメソッドが書き換えられ、書き換え後の効果は2つのオブジェクトの値が等しいかどうかを比較することである
  • .
    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つの比較は同じ
  • である.
  • equalsが書き換えられた場合、2つの比較は自然に異なる
  • である.
  • String内部のデフォルトではequalsメソッドが書き換えられているため、"=="比較参照、equals比較値
  • Stringテスト
    ("=="比較参照,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が参照するオブジェクトを直接参照します.
    だから
  • str 1=str 2:両方が参照するオブジェクトは同じで、「hello」です.
  • str 1.equals(str 2)も同じです.両方の値は同じ
  • です.
    2つの値の異なる文字列を直接定義して比較
    String str1 = "hello";
    String str2 = "hi";
    System.out.println(str1 ==  str2); // false
    System.out.println(str1.equals(str2)); // false
    
  • 両者が参照するオブジェクトは異なるのでstr 1==str 2はfalse
  • に違いない
  • 両者の値も異なるので、以下もfalse
  • new 2つの値が同じ文字列を比較する
    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つのオブジェクトを含み、2つのオブジェクトの参照は必ず同じではなく、2等の比較はfalse
  • である.
  • ただし、2つのオブジェクトの値は同じであり、いずれも「Hello」であるため、equalsの比較は同じtrue
  • である.
    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
    
  • newは2つのオブジェクトを含み、2つのオブジェクトの参照は必ず同じではなく、2等の比較はfalse
  • である.
  • 両オブジェクトの値も異なるため、equalsの比較が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
    
  • str 2 newは新しいオブジェクトであるためstr 1の参照とは同一ではなく、二等の比較はfalse
  • である.
  • ですが、両者の値は同じなので、equalsの比較は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
    
  • str 2 newは新しいオブジェクトであるためstr 1の参照とは同一ではなく、二等の比較はfalse
  • である.
  • は両者の値が異なるためequalsの比較も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
    
  • equalsは書き換えられていないので、両方の比較は同じで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
    
  • equalsは書き換えられていないため、両方の比較は比較参照が同じかどうかであり、オブジェクトの値とは無関係であるためfalse
  • である.
    まとめ
    ≪基本データ型|Basic Data Type|oem_src≫:基本データ型には参照オブジェクトがないため、「==」の効果は比較値が同じかどうかであり、基本データ型にはequalsメソッドはありません.
    参照データ型:"="とequalsの両方が比較参照のオブジェクトであるかどうか
  • equalsメソッドは、
  • を書き換えることができる.
  • String内部のデフォルトはequalsメソッドを書き換え、両者の値が等しいかどうかを判断する
  • に効果を与える.
  • 文字列を作成すると、
  • 文字列定数プールで検索されます.