2つのオブジェクトを「==」で比較すると、両方のアドレスが比較されることは誰もが知っています。そして、「等しい」は、比較するときに両方の値を比較します。
しかし、今日は、3つのビューをリフレッシュする何かをお話します。
StringBuffer a=new StringBuffer("a");
StringBuffer b=new StringBuffer("a");
System.out.println(a==b);//false
System.out.println(a.equals(b));//false
String c=new String("a");
String d=new String("a");
System.out.println(c==d);//false
System.out.println(c.equals(d));//true
オブジェクトを新しくすると、メモリ内のアドレスが割り当てられます。新しいオブジェクトがそれらのアドレスを比較する限り、結果はfalseですが、equalsは値を比較するため、a.equals(b)が次のようになります。 false、およびc.equals(d)がtrueになりますか?
これには、ソースコードとjdkを確認する必要があります
equalsメソッドはStringパッケージの下でオーバーライドされます
これは文字列のequalsのソースコードです
Stringパッケージのequalsメソッドはオーバーライドされませんが、equalsメソッドはobjecから継承されます
StringBufferにはequalsをオーバーライドするメソッドがないため、2つのオブジェクトのアドレスを比較しますが、Stringの親クラスから継承されたequalsメソッドはオーバーライドされ、書き換え後に2つのオブジェクトの値が比較されます。
誰もがこのコードを見ています
class Demo1{}
Demo1 a=new Demo1();
Demo1 b=new Demo1();
System.out.println(a.equals(b));//false
System.out.println(a==b);//false
a=b;
System.out.println(a.equals(b));//true
System.out.println(a==b);//true
文字列以外の変数の場合、ヒープメモリ内の最初のアドレスを比較するために「==」と「equals」が使用されるため、最初の2つの出力はfalseであり、b。のアドレスをポイントした後に出力されます。本当。
[1] https://wenku.baidu.com/view/008b31e2f12d2af90342e667.html