假设我在Java中编写了如下内容:
String a = args[0]; // user input from keyboard
String b = a + "foo1";
String c = "foo2" + "foo3";
是否会在字符串池中创建"foo1"、"foo2"、"foo3"?
假设我在Java中编写了如下内容:
String a = args[0]; // user input from keyboard
String b = a + "foo1";
String c = "foo2" + "foo3";
是否会在字符串池中创建"foo1"、"foo2"、"foo3"?
字符串"foo1"
和"foo2foo3"
的值为compile time constant expressions,两者都将被插入.
其他字符串都不会.
a
人未被拘留.
a + "foo1"
人未被拘留.
"foo2"
或"foo3"
都没有被拘留.事实上,runtime String
个对象甚至没有为这两个文本创建."foo2" + "foo3"
表达式在编译时求值.
字符串是不可变的这一事实并不能预测字符串值是否为内部值.(所有字符串都是不可变的,但只有一些字符串是插入的.)
最后,所有这些都与practical编程无关.如果您始终使用equals(...)
来测试字符串,则实习(或不实习)对程序行为没有影响.
在现代JVM中,GC的字符串重复数据消除功能是管理可能重复的字符串所消耗的空间的更好方法,而不是保留.而且文字/常量表达式占用的内存量无论如何都应该是微不足道的.