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