HOWTO · Java

Java での string.equals()と==の比較

この記事では、Java での Stringequals と==の違いを紹介します。

このページの内容

Java には、2 種類のオブジェクト比較があります。1つ目は、== 演算子がアドレスの操作を操作することです。オブジェクトの参照を内部的に比較します。一方、equals メソッドはインスタンスの実際のコンテンツを比較します。

以下は、演算子とその動作を示すコードブロックです。

public class Main {
  public static void main(String[] args) {
    String str1 = "name";
    String str2 = "name";
    String str3 = new String("name");
    System.out.println(str1.equals(str2));
    System.out.println(str1 == str2);
    System.out.println(str1.equals(str3));
    System.out.println(str3 == str1);
  }
}

上記のコードブロックでは、文字列の 3つのインスタンスが定義されています。文字列クラスは本質的に不変です。不変性とは、作成されたインスタンスがオーバーライドされないことを意味します。

さらに、変数はヒープ位置にメモリを保持します。したがって、文字列 name を作成している間、ヒープメモリに保存されます。同じ name 値を持つ別の新しいインスタンス str2 が初期化されると、JVM はそのインスタンスに対して別の新しいアドレスを作成しません。代わりに、str1 インスタンスの参照を str2 変数に割り当てます。

str1==str2 を両方の文字列インスタンスと比較しようとすると、この事実が証明されます。両方の参照がメモリ内の同じ名前アドレスを指しているため、ステートメントの結果は true になります。説明されている事実は、下の図でよりよく理解できます。

文字列ヒープメモリと定数プール割り当ての説明

同様に、equals メソッドが両方のインスタンスに適用されると、ブール値の true 値になります。関数はコンテンツ比較で機能するため、同じです。

次に、別の文字列 str3 変数が new キーワードを使用して初期化されます。JVM は、インスタンスを str3 変数に割り当てる代わりに、ヒープメモリに name アドレス用の新しいスペースを内部的に作成します。したがって、コンテンツの比較が行われると、equals 関数で true が返されます。== 演算子を使用してアドレスを比較すると、false が返されます。

上記のコードブロックの出力は次のとおりです。

true
true
true
false