Java==equalsとの違いをまとめました。

2813 ワード

Javaの中で==equalsとの違いは、わずかな人が完全に正しいと言えるような気がします。
よくあるエラーの答えは、==ベースタイプの対比は同じかどうか、参照タイプの対比は参照が同じかどうかです。equalsは比較値が同じかどうかである。
なぜそれが間違っているかというと、本文を読み終わったら、=と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です。new 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
アウトプットの結果は予想外で、なんとfalseですか?これはどういうことですか?equalsのソースコードを見れば分かります。ソースは以下の通りです。

public boolean equals(Object obj) {

    return (this == obj);

}
もともとequalsは本質的に==です。
問題が来ました。同じ値のStringオブジェクトが二つありますが、なぜtrueに戻りましたか?コードは以下の通りです

String s1 = new String("  ");

String s2 = new String("  ");

System.out.println(s1.equals(s2)); // true
同じように、Stringのequals方法に入ると、答えが見つかりました。コードは以下の通りです。

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;

}
StringがObjectを書き直したequals方法で、引用比較を値比較に変えました。
3、まとめ
全体としては、==は基本的なタイプにとって値比較であり、参照のタイプにとっては比較的参照である。equalsはデフォルトでは参照比較ですが、多くの種類がequals方法を書き換えました。例えば、String、Integerなどは値比較になりますので、equalsは値が等しいかどうかを比較します。