この2点で迷っています。助けが必要です。String Constant Pool と String pool の両方が同じ概念であるかどうか、私の疑問を解消してください。私は面接でこの質問に直面しました。すでにたくさんのサイトやブログを読んでいますが、私の疑問は解消されません。私の疑問を解消してください。
前もって感謝します。
この2点で迷っています。助けが必要です。String Constant Pool と String pool の両方が同じ概念であるかどうか、私の疑問を解消してください。私は面接でこの質問に直面しました。すでにたくさんのサイトやブログを読んでいますが、私の疑問は解消されません。私の疑問を解消してください。
前もって感謝します。
文字列プール (= "文字列定数プール"):
これは、String のクラスレベル/静的インターン ストレージに付けられた非公式のニックネームです。注: javadoc は「文字列のプール」http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29について言及しています。
これは、アプリの実行中にインターンされたすべての一意の文字列値を含むセットです。インターニングは、すべてのコンパイル時の文字列定数 (リテラルおよび固定式) と、呼び出されるすべての実行時の文字列値に対して自動的に行われますString.intern()
。JLS は、メソッド String.intern を使用して、一意のインスタンスを共有するために、String 型のコンパイル時の定数式を常に「インターン化」することを義務付けています。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28
JVM 仕様は、オブジェクトの特定の内部構造を義務付けていません。 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.7
Java 言語仕様では、String オブジェクトが一定の (不変の) 値を持つことを義務付けています。http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.3.3
つまり、String 変数は、新しい String オブジェクトを新しいオブジェクトで参照することによってのみ値を変更できます。値 - もちろん、これはコンパイラーと JVM によって内部的に管理されます。これは、プール内のすべての項目が文字列定数であることも意味します。
定数プール (文字列に焦点を当てていませんが、文字列を含みます):
私はそれについて考えましたが、よくわかりませんが、文字列プールは文字列リテラル プールを参照するString apple = "apple";
可能性があります。そのようなトリッキーなセマンティクスは、インタビューで入手した場合、私を悩ませます