4

文字列リテラルを作成すると、permgenspace内に入ることを知っています。私の質問は、その文字列リテラルがメソッドに対してローカルであっても、jvmの存続期間中はそこにあるのでしょうか。たとえば、以下のコードスニペットがあります:-

private static void testString1(){
        String str1="tetingLiteral";
    }


private static void testString2(){
        String str2="tetingLiteral";
    }

今私が呼び出すメインメソッドから

testString1();
testString12();

str1とstr2は同じメモリ位置を参照します。

私の理解では、それらは同じメモリ位置を参照します(文字列リテラルがメソッド内で作成された場合でも、jvmの存続期間中はそこにとどまります)。しかし、文字列のメモリ位置を印刷する方法がないため、プログラムで確認できなかったため、確認したかったのです。

4

2 に答える 2

9

Java言語仕様のセクション3.10.5から:

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

(そして、以下の例を参照してください。これは、文字列インターンが異なるパッケージのクラス間でも機能することを示しています。)

于 2013-03-24T09:07:08.147 に答える
5

正確な実装はJVM固有ですが、Oracle Java 7では、文字列リテラルはヒープ上にあり、文字列リテラルを使用するクラスがない場合(アンロードされているため)にクリーンアップできます。

于 2013-03-24T09:28:43.377 に答える