2

重複の可能性:
Equals と == の違い
JDK 1.6 では、String equals 操作を == に置き換えることができますか?
Javaで文字列を比較するにはどうすればよいですか?

Java-Strings で遊んでいる間、私は次の結果を期待していませんでした:

public class Sandbox {
    public static void main(String[] args) {
        String a = "hello";
        String b = "hello";

        System.out.println(a == b);             //true        Why?, a and b both are seperate Objects
        System.out.println(a == "hello");       //true        Why?
        System.out.println(a == new String(b)); //false       As expected
    }
}

「==」は参照を比較するため、すべてが false であると予想していました。この結果はなぜですか?

を変更するString b = "world"と、System.out.println(a == b);が返さ れますfalse。String-Object の内容を比較しているようです。

Java 7 は switch-case-Statements で文字列を比較できるので、Java-Version と関係があるのではないかと考えました。ただし、hereで説明されているように、Switch-Case 内の文字列を比較するときに equals-Methode が呼び出されます。

4

2 に答える 2

3

Java は常に (バージョン 1.0 以降) 文字列リテラルをインターンしています。これは、定数文字列がプールに追加され、複製が同じオブジェクトを参照することを意味します。

final String a = "hello";
final String b = "hell";
System.out.println(a == b + 'o');

これは、コンパイラが式をインライン化し、 「hello」と同じになるようにtrue単純化できるため、出力されます。b + 'o'

于 2012-04-12T11:45:00.657 に答える
2

JVM は、文字列リテラルをインスタンス化する際にいくつかのトリックを実行して、パフォーマンスを向上させ、メモリ オーバーヘッドを削減します。JVM で作成される String オブジェクトの数を削減するために、String クラスは文字列のプールを保持します。コードが文字列リテラルを作成するたびに、JVM は最初に文字列リテラル プールをチェックします。文字列がプールに既に存在する場合は、プールされたインスタンスへの参照が返されます。文字列がプールに存在しない場合、新しい String オブジェクトがインスタンス化され、プールに配置されます。文字列は不変であり、データの破損を心配することなく共有できるため、Java はこの最適化を行うことができます。

于 2012-04-12T11:44:22.283 に答える