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

不言
リリース: 2019-03-07 17:34:48
転載
3606 人が閲覧しました

この記事では、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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!