java:readLine方法把字符串放到字符串文字池中?

时间:2012-04-13 04:03:27

标签: java

我知道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”对象,堆中会有一个字符串对象吗?

2 个答案:

答案 0 :(得分:4)

3)readLine()不会使用字符串池中的值。你必须先打电话给intern()

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

来自String Javadoc

  

所有文字字符串和字符串值常量表达式都是实体。字符串文字在§3.10.5 of the Java Language Specification中定义。

答案 1 :(得分: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()调用字符串,它肯定是在现代JVMS中收集的垃圾。    如果许多字符串具有相同的内容,它可用于节省内存。

这里有一个很好的讨论:

Is it good practice to use java.lang.String.intern()?