「==」と「等しい」は時々あなたが思うものではありません

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

おすすめ

転載: blog.csdn.net/MCYZSF/article/details/89914955