Javaでの同等の判断

4182 ワード

今日初めて自分のブログを作成して、自分が初めて本格的にブログの文章を书いて、自分に小さな目标を决めて、后で毎日1篇のブログがオンラインになることができて、毎日1篇の小さい博文、2月曜日の中型博文、1ヶ月の1篇の大型博文、卒业した后にアリに入ることができることを望んで、よくなったら直接本題に入ります.前にequalsと==の比較についていくつかの質問を見たことがありますが、自分でまとめたことがないと何だか覚えられないし理解できないので、一番いい勉強方法は自分でまとめたほうがいいと思います.この問題を明らかにするには、基本データ型と他のデータ型、クラスに分けて見る必要があると思います.まず、この問題における基本データ型の表現を見てみましょう.まず、理解する必要があります.ポイント演算子はクラスのメンバーやメソッドにしか使用できないため、基本的なデータ型(論理型boolean、文字型char、整数byte、short、int、long、浮動小数点型float、double)は使用できない.equalsは判断を行い,この場合は「==」でしか判断できないが,この場合「==」の意味は数字上の和文字上の等しいだけである.他のデータ型のこの問題での表現を見てみましょう.その中で最も代表的なのはStringという基本的なデータ型ではありませんが、非常に頻繁に使用されているデータ構造です.まず「==」をテストします.コードは以下の通りです.
String sentence1 = "  ";
String sentence2 = "  ";
System.out.println(sentence1 == sentence2);//true
System.out.println(sentence1.equals(sentence2));//true

「==」は「.equals()」の場合と同様にtrueとなります.実はこの时私はとても疑問に思って、どうして彼らの結果はすべて同じですか?javaでlang.Stringのソースコードでは、「.equals」メソッドは次のように定義されます.
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;//    .equals()         ,   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;
    }

ソースコードから見ると、実際にはequalsは値の分析(1つ1つのcharで比較)を行います.「==」はアドレスの比較に特化していると推測します.次のコードで証明します.
String sentence1 = new String("a");
String sentence2 = new String("a");
System.out.println(sentence1 == sentence2);//false
System.out.println(sentence1.equals(sentence2));//true
sentence1 = sentence2;//            
System.out.println(sentence1 == sentence2);//true

ここ数日また新しい問題に遭遇しました:Stringがそうである以上、Objectはどうですか.ソースコードを持ってソースコードを見るという考えを持って、コードを見つけたのは以下の通りです.
public boolean equals(Object obj) {
    return (this == obj);
}

Objectクラスのソースコードで、このような行のコードを見つけます.this=obj、OMGはそんなに怠けてもいいのでしょうか.だから、ObjectのequalsメソッドとStringメソッドは違います.Objectのequalsメソッドはアドレスが同じかどうかを比較します.コードで検証してみましょう.
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.equals(o2));//false

まず、2つの「同じ」空のオブジェクトを作成し、使用します.equalsを比較した結果falseであり,我々の推測も確認された.まとめてみます:.equals()は判定値に用いられ,==は判定アドレスに用いられる.