3
public class Test {
    int multiple;
    public static void main(String[] args){

        String string1 = "string";
        String string2 = "string";
        String string4 = "Changed";

        String string3 = new String("string");

        System.out.println("string1 == string2: " + (string1 == string2));\\true
        System.out.println("string1 == string4: " + (string1 == string4));\\false
        System.out.println("string1 == string3: " + (string1 == string3));\\false

    }


}

参照が同じ場合、==演算子が戻ることを理解しています。true私が知りたいのは、Javaはオブジェクトを作成する前に文字列リテラルの内容をチェックしますか?

4

2 に答える 2

4

Java文字列インターンの副作用の1つが見られます。JLS§3.10.5から:

...文字列リテラルは常にクラスの同じインスタンスを参照しますString。これは、文字列リテラル(または、より一般的には、定数式(§15.28)の値である文字列)が、メソッドを使用して一意のインスタンスを共有するように「インターン」されるためString.internです。

SOについてもっと読む、特に:

于 2012-04-15T15:40:20.203 に答える
3

文字列のインターンを行うのはコンパイラです。したがって、コンパイル時に同一の文字列が最適化されます。ですから、あなたが望む答えは「いいえ」だと思います。仮想マシンはそれを行いません、それはコンパイラです。String.intern()文字列プール内の共有文字列オブジェクトを取得するために呼び出すことができます。

String str1 = "string";
String str2 = new String("string");
String str3 = str2.intern();

str1 == str2 // false
str2 == str3 // false
str1 == str3 // true

実行時にビルドされる文字列は、自動的にインターンされません。

于 2012-04-15T15:40:27.640 に答える