一尘不染

有关Java的字符串池的问题

java

考虑以下代码:

String first = "abc"; 
String second = new String("abc");

使用new关键字时,Java会abc String再次创建吗?这将存储在常规堆还是String池中?多少人String在将s结尾String池?


阅读 311

收藏
2020-02-26

共1个答案

一尘不染

如果使用new关键字,String将创建一个新对象。请注意,对象始终在堆上-字符串池不是与堆分开的独立内存区域。

字符串池就像一个缓存。如果你这样做:

String s = "abc";
String p = "abc";

那么Java编译器是聪明足以让只有一个String对象,s并且p将两者指的是同一个String对象。如果你这样做:

String s = new String("abc");

那么String池中将有一个对象,该对象代表文字"abc",并且池中将有一个单独的String对象(不在池中),其中包含池对象的内容的副本。由于StringJava中是不可变的,因此你无法从中获得任何收益。调用new String("literal")Java中从没有意义,并且效率低下。

请注意,你可以调用intern()一个String对象。String如果该对象尚不在池中,则会将其放入池中,并返回对池字符串的引用。(如果它已经在池中,则只返回对已经存在的对象的引用)。有关更多信息,请参见该方法的API文档。

2020-02-26