Javaの「==」と「等しい」を説明する

1. 「= =」「==」=="
Javaの「==」==の場合==比較すると、基本データ型を比較す​​ると、基本データ型の値が比較されます(注:等号の両側のデータ型は同じである必要はありません。値が同じである限り、trueを返すことができますが、いくつかの異なるデータ型を比較す​​ると、コンパイラーは直接エラーを報告します)

 public static void main(String[] args) {
    
    
        int a=1;
        int b=1;
        char c=1;
        byte d=1; //byte数据类型:代表一个字节(8位:-128~127)
        boolean e=true;
        System.out.println(a==b);//true
        System.out.println(a==c);//true
        System.out.println(a==d);//true
        System.out.println(a==e);//报错
    }

Javaの基本的なデータタイプは次のとおり
です。1.ロジックタイプ:ブール
2.テキストタイプ:char
3.整数タイプ:バイト、ショート、整数、ロング
4.浮動小数点タイプ:ダブル、フロート。

つまり、上記のデータ型の場合、"= =" "=="=="すべての値が比較されます。値が等しい場合はtrueが返され、値が等しくない場合はfalseが返されます。

比較が基本的なデータ型ではなく、参照型の場合、「= = "" == "=="比較はそれらの「内容」の値ではなく、2つのメモリアドレスの値です。2つのメモリアドレスが同じ場合はtrueを返し、そうでない場合はfalseを返します。

 public static void main(String[] args) {
    
    
        Object a=new Object();
        Object b=new Object();
        Object c= a;
        System.out.println(a==b);//false
        System.out.println(a==c);//true

    }

Javaの参照型は次のとおり
です。1.クラス:クラス
2.インターフェース:インターフェース
3.配列:配列

Stringクラスに巨大な穴を記録します。

 public static void main(String[] args) {
    
    
       String a="123";
       String b="123";
       String c=new String("123");
       String d=new String("123");
       System.out.println(a==b); //ture
       System.out.println(a==c); //false
       System.out.println(c==d); //false
    }

文字列a、b、c、dの値がすべて等しいように見えるのはなぜですか、== ====符号比較の結果は、一部は等しいが一部は異なるということです。これには、Javaの基本的な原則が含まれます。文字列オブジェクトを作成する方法は2つあり、1つは文字列a = "123"、もう1つは文字列c = new String( "123")です。最初の方法でオブジェクトを作成すると、オブジェクトが作成されます。 Javaの定数プールでは、特定の作成方法は、Java仮想マシンが定数プールにオブジェクト「123」があるかどうかを検出することです。存在する場合、オブジェクトは「123」への参照を直接返します。存在しない場合、オブジェクト「123」を作成します。 "そして、その参照を返すため、実際には、aとbは同じオブジェクト" 123 "への参照です。オブジェクトが2番目の方法で作成された場合、オブジェクトが作成されてからヒープ内に作成され、仮想マシンがヒープ内に作成されますオブジェクト。次に、定数プールでオブジェクト「123」を検索します。見つからない場合は、定数プールでオブジェクトを作成し、定数プールのオブジェクト「123」をヒープ内の新しく作成されたオブジェクトにコピーして、ヒープ内のオブジェクトを返します。したがって、cとdによって参照されるオブジェクトはヒープ内にあり、それらは異なるオブジェクトです。明らかに、cとdのオブジェクトアドレスは異なりますが、aとbのオブジェクトアドレスは同じです。
ここに画像の説明を挿入

2.
equals ()equalsメソッドのプロトタイプはクラスObjectにあり、Objectクラスはすべてのクラスの親クラスです。Objectクラスのequalsメソッドのソースコードを見ると、コードが1行しかないことがわかります。

ここに画像の説明を挿入
また、Objectクラスでequalメソッドと== ==を確認できます==同じです。クラスのアドレス比較ですが、equalsメソッドは他の多くのクラスで書き直され、Stringクラスなどのアドレス比較ではなくなりました。
ここに画像の説明を挿入
Stringクラスのequals()の場合、アドレスが同じであればtrueを返します。アドレスが異なる場合、StringLatin1クラスのequals()メソッドまたはStringUTF16のequals()メソッドが呼び出されます。

StringLatin1クラスのequals()メソッドを見てみましょう(StringUTF16クラスの原理は似ています)

ここに画像の説明を挿入

明らかに、StringLatin1クラスのequals()メソッドは文字列を文字ごとに比較しているので、equals()メソッドがStringクラスで書き直された後は、アドレス比較ではなく、値の比較なので、 2つの文字列が等しいかどうかを比較する場合は、== ==を使用しないことをお勧めします==、ただし、equalsメソッドを使用します。

public class Main{
    
    
    public static void main(String[] args) {
    
    
        String a=new String("123");
        String b=new String("123");
        System.out.println(a==b);//false
        System.out.println(a.equals(b));//true
    }
}

おすすめ

転載: blog.csdn.net/CY2333333/article/details/107968005