如果使用
new关键字,
String将创建一个新对象。请注意,对象始终在堆上-字符串池不是与堆分开的独立内存区域。
字符串池就像一个缓存。如果你这样做:
String s = "abc";String p = "abc";
那么Java编译器是聪明足以让只有一个
String对象,
s并且
p将两者指的是同一个String对象。如果你这样做:
String s = new String("abc");那么
String池中将有一个对象,该对象代表文字
"abc",并且池中将有一个单独的
String对象(不在池中),其中包含池对象的内容的副本。由于
String在
Java中是不可变的,因此你无法从中获得任何收益。调用
new String("literal")在Java中从没有意义,并且效率低下。
请注意,你可以调用
intern()一个
String对象。
String如果该对象尚不在池中,则会将其放入池中,并返回对池字符串的引用。(如果它已经在池中,则只返回对已经存在的对象的引用)。有关更多信息,请参见该方法的API文档。



