ホームページ >Java >&#&チュートリアル >[JAVA] String.equals と == のさまざまな効果

[JAVA] String.equals と == のさまざまな効果

高洛峰
高洛峰オリジナル
2016-12-16 09:50:531469ブラウズ

1 最も単純なプログラム:

public class A {    public static void main(String args[]) {
        String s1 = "Hello";
        String s2 = "Hello";
        System.out.println(s1 == s2);
    }
}

true を出力することは、s1 と s2 が同じものを参照していると言う人が多いでしょう。しかし、このプログラムが別の方法で書かれていたら、間違いなく違ったものになるでしょう。

2 最初のバリエーション:

public class A {    public static void main(String args[]) {
        String s1 = "Hello";
        String s2 = new String("Hello");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

または:

public class A {    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }
}

別々に考えると、結果は少し不確かになります。少なくとも 1 つは同じではありません。

これら 2 つのプログラムの結果は false true です。理由は非常に単純です。JAVA は基本的に完全なオブジェクト指向言語であり、その参照 (メモリ アドレスとポインタに相当) を決定します。メソッドは、値が等しいかどうかを判断します。

次の式では:

String s1 = "Hello";
String s2 = new String("Hello");

JVM が取得するのは 2 つの異なるメッセージです:
1. 「Hello」文字列を作成したいです。
2. 元の文字列と同じではなく、新しい「Hello」文字列を作成したいです。
つまり、 s1 != s2.

3 2 番目の変形:

顺序排列:
public class A {
    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s2 = new String("Hello");
        String s3 = "Hello";
        s1=s1.intern();
        s2=s2.intern();
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
    }
}
打乱顺序排列:
public class A {
    public static void main(String args[]) {
        String s1 = new String("Hello");
        String s3 = "Hello";
        s1=s1.intern();
        String s2 = new String("Hello");
        s2=s2.intern();
        //也可以String s2 = new String("Hello").intern();
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s3 == s2);
        System.out.println(s3.equals(s2));
    }
}

そうすると、今度は明らかになるはずです =
2 つのオブジェクトですが、途中にいくつかの恥ずかしいものが追加されているため、答えは true true true true でなければなりません。
それでは、インターンとは何ですか?

4 インターンの役割:

インターンメソッドが呼び出されたとき、この String オブジェクトと等しい文字列がプールに既に含まれている場合 (オブジェクトは、equals(Object) メソッドによって決定されます)、プール内の文字列が返されます。 。それ以外の場合は、この String オブジェクトをプールに追加し、この String オブジェクトへの参照を返します。

インターンに該当する状況: 複数の同一メッセージが出現する可能性があるメッセージキューの設計など、複数の同一の大きな文字列が同時に出現する状況。




さまざまな効果に関する [JAVA] String.equals および == 関連記事の詳細については、PHP 中国語 Web サイトにご注意ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。