2

我知道 String a = "hello"; 会将“hello”放入字符串文字池中。我的问题是:
1。

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

字符串文字池是否具有三个对象:“hello”、“hell”和“o”?

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

AFAIk,这些是正在发生的事情:

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 回答