2

String a = "hello"; であることは知っています。「こんにちは」を文字列リテラルプールに入れます。私の質問は:
1.

String a = "hello";
String b = "hell"+"o";

文字列リテラル プールには、"hello"、"hell"、"o" の 3 つのオブジェクトがありますか?

2.

String a = "hello";
String b = new String("hello");

次に、文字列リテラルプールに「hello」オブジェクトがあり、ヒープに文字列オブジェクトがありますか?

3.

BufferedReader br = new BufferedReader(new FileReader("names"));
String line = br.readLine(); //(the value of line is "hello" now, for example)

次に、文字列リテラルプールに「hello」オブジェクトがあり、ヒープに文字列オブジェクトがありますか?

4

2 に答える 2

4

3)readLine()文字列プールの値を使用しません。intern()最初にそれを呼び出す必要があります。

line = br.readLine().intern();

StringJavadocから:

すべてのリテラル文字列と文字列値の定数式はインターンされます。文字列リテラルは、Java 言語仕様の §3.10.5 で定義されています。

于 2012-04-13T04:07:55.577 に答える
2

私の知る限り、これらは起こっていることです:

1. javac コンパイラが上記の行に遭遇すると、次のように変更しStringBufferます。

String b = new StringBuffer().append("hell").append("o").toString();

String a will be in pool with the value "hello".

2 String b will in the heap.

3.これは、ファイルの内容を動的にロードしているため、純粋にメモリ内操作です.Javaコンパイラは決して

現在、ファイルサイズに依存しているため、メモリ構造を知る機会を得てください。したがって、プールすることはできません。しかし、intern() を実行すると、次のことが起こります。

メソッド intern() で文字列を呼び出すと、最新の JVMS では確実にガベージ コレクションが実行されます。同じ内容の文字列が多数ある場合、メモリを節約するために使用できます。

これについての素晴らしい議論がここにあります:

java.lang.String.intern() を使用するのは良い習慣ですか?

于 2012-04-13T04:45:15.577 に答える