ホームページ  >  記事  >  バックエンド開発  >  Java における == と等しいの違いの詳細な説明

Java における == と等しいの違いの詳細な説明

不言
不言転載
2019-03-07 17:34:483577ブラウズ

この記事では、Java の == とイコールの違いについて詳しく説明します。一定の参考値があります。困っている友人は参照してください。お役に立てれば幸いです。

Java における == とイコールの違いについて、完全に正しく言える人は少数だと思います。

よくある間違った答えは次のとおりです: == 基本型は値が同じかどうかを比較し、参照型は参照が同じかどうかを比較し、equals は値が同じかどうかを比較します。

なぜそれが間違っているかについては、この記事の == と等しいの解釈を読めばわかります。

1. == 解釈

== の効果は、次のように基本型と参照型で異なります:

基本型:比較は値が同じかどうかです; 参照の種類: 比較は参照が同じかどうかです;

コード例:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

コードの解釈: x と y は、同じ参照なので、 = = も true になり、新しい String() メソッドはメモリ領域を空けるために書き直されるため、== の結果は false になり、equals は常に値を比較するため、結果はすべて true になります。

2.equals

equals の解釈は、String と Integer がequals メソッドをオーバーライドして値の比較に変える点を除いて、本質的に == です。以下のコードを見て理解してください。

まず、デフォルトで、equals が同じ値を持つオブジェクトをどのように比較するかを見てみましょう。コードは次のとおりです:

class Cat {
    public Cat(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

出力結果は予想を超えています。偽ですか?何が起こっているのでしょうか? イコールのソース コードを読めばわかります。ソース コードは次のとおりです:

public boolean equals(Object obj) {
        return (this == obj);
}

イコールは本質的に == であることがわかります。

それでは、なぜ同じ値を持つ 2 つの String オブジェクトが true を返すのかという疑問が生じます。コードは次のとおりです:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同様に、文字列の等しいメソッドを入力すると、答えが見つかります。コードは次のとおりです:

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;
}

文字列が等号をオーバーライドすることがわかります。オブジェクトのメソッドを変更し、参照比較を変更すると値比較になります。

3. 概要

一般に、== は基本型の値の比較であり、参照型の場合は参照であり、デフォルトと等しいです。 、これは参照比較ですが、多くのクラスは String や Integer などの等しいメソッドをオーバーライドして値の比較に変えているため、通常の状況では、equals は値が等しいかどうかを比較します。

以上がJava における == と等しいの違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。