0

私が呼び出すとき

System.out.println("print this line here");

文字列です

"print this line here"

インターン?

クラスStringには、値のプール内のすべての新しいString値 (コンストラクターの明示的な呼び出しによってインスタンス化されたものを除く) を検索し、見つからない場合にのみその値のStringオブジェクトを作成するネイティブインターニングメカニズムがあります。このプールで。

これが文字列定数でどのように機能するのか疑問に思っています。したがって、ループ内でこのステートメントを呼び出すたびに、「ここにこの行を印刷する」がインターンされます-プールを調べて、そこにあるかどうかを確認します... ?

//======================

注: これは私の prev.Q here と似ていますが、異なります。

4

3 に答える 3

1

Java 言語仕様の関連する章はこちらです。それは述べています

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

だから、はい、Stringリテラル"print this line here"はインターンされています。

これが文字列定数でどのように機能するのか疑問に思っています。したがって、ループ内でこのステートメントを呼び出すたびに、「この行をここに出力する」がインターンされます-プールを調べて、そこにあるかどうかを確認します... ?

正確ではありませんが、バイトコードは少し異なります。Stringスタックにプッシュされるクラスの定数プール内のオブジェクトへの特定の参照が表示されます。

これはバイトコードで確認できます

 public static void main(java.lang.String[]) throws java.lang.Exception;    Code:
      0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      3: ldc           #3                  // String print this line here
      5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      8: return

命令が使用される場所ldc

定数プール (String、int、または float) から定数 #index をスタックにプッシュします

その定数は、println()メソッド呼び出しで使用されます。

于 2013-11-12T02:35:06.247 に答える
0

Stringリテラルはコンパイル時の定数であり、デフォルトでインターンされます。

于 2013-11-12T02:33:26.250 に答える