我知道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”对象,堆中会有一个字符串对象吗?
答案 0 :(得分:4)
3)readLine()
不会使用字符串池中的值。你必须先打电话给intern()
。
line = br.readLine().intern();
所有文字字符串和字符串值常量表达式都是实体。字符串文字在§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中收集的垃圾。 如果许多字符串具有相同的内容,它可用于节省内存。
这里有一个很好的讨论: