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