Java の文字列「==」と「equals」に関する質問は Java 学習の最も基本的な質問ですが、Java を学習したばかりの学生の中には原理をよく理解していない人がまだたくさんいます。私は最近この問題について友人と話し合いました。 , そこで私自身の理解を共有するために記事を書きました。
まず例を見てみましょう。
次のようにコードをコピーします。
パブリック クラス TestStringEquals {
public static void main(String[] args) {
文字列 a = "テスト";
文字列 b = "テスト";
String c = new String("test");
String d = new String("test");
文字列 e = a;
文字列 f = 新しい文字列(a);
文字列 g = a + "";
System.out.println(a == b ? "式 /"a==b/" は true"
: "式 /"a==b/" は false");
System.out.println(a == c ? "式 /"a==c/" は true"
: "式 /"a==c/" は false");
System.out.println(c == d ? "式 /"c==d/" は true"
: "式 /"c==d/" は false");
System.out.println(a == e ? "式 /"a==e/" は true"
: "式 /"a==e/" は false");
System.out.println(a == f ? "式 /"a==f/" は true"
: "式 /"a==f/" は false");
System.out.println(a == g ? "式 /"a==g/" は true"
: "式 /"a==g/" は false");
if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
システムアウト
.println("a に等しい b に等しい c に等しい d に等しい e に等しい f に等しい g");
}
}
}
まだ答えがない場合は、すべてが正しいことを保証できますか?
答えは以下で発表されます。
次のようにコードをコピーします。
式「a==b」は真です
式「a==c」は偽です
式「c==d」は false です
式「a==e」は true
式「a==f」は false です
式「a==g」は偽です
<div style="text-align: left;"></div>a に等しい b に等しい c に等しい d に等しい e に等しい f に等しい g
このような問題をよく理解するには、Java の String の「==」メソッドと「equals」メソッドの仕組みと原理を深く理解するのが一番です。 「equals」は文字列の内容を比較することであることは誰もが知っているはずです。上記のプログラムの文字列の内容はすべて「test」であるため、equals と比較するとそれらはすべて等しいことになります。
しかし、Javaの基本クラスObjectのequalsメソッドと「==」メソッドは、実は同じものであることをご存知ですか? String クラスが Object クラスを継承した後 (Java のすべてのクラスは Object クラスを継承します)、equal メソッドをオーバーロードして、文字列の内容の比較を行うだけです。
等号について十分に理解した後、「==」メソッドの複雑さを学びましょう。
「==」は Java の演算子です。比較する内容は 2 つのオブジェクトのポインタ、つまり実際のオブジェクトのアドレスです。したがって、e==a が true を返すことは容易に理解できます。
もう一度 c と d の比較を見てみましょう。 new キーワードが表示されると、c と d の両方がメモリ アドレスを再適用し、値「test」を割り当てたことを意味するため、c==d は false を返します。それも同じように理解できる
a、c、d、f の間の「==」演算はすべて false を返します。
次に、 g= a + "" を見てみます。 new キーワードは表示されていませんが、String クラスの "+" 演算子がオーバーロードされているため、オーバーロードされたメソッド内に新しい String が追加されることになるので、上記のようになります。状況。次に、最も理解しにくいのは、a と b の比較です。実際、これは Java コンパイラの最適化の結果です。ステートメントがコンパイルされた後、「test」はこの文字列定数プールに格納され、b が再度定義されると、b は引き続きこの領域を指すため、a と b は同じ領域を指します。したがって、a==b は true を返します。