String Pool正如它的名字所说明的那样,是在heap memory中保存一个字符串池.
使用String Pool主要的目的是用来节省存储空间,一般java程序中分布着大量的字符串变量.Java中String对象的内容是不能被修改的,因此,如果字符串的内容是一样,就没有必要再重新创建一个新字符串对象来表示,完全可以把已经存在的对象作为返回,这样可以有效剩下空间.这种方式需要在定义字符串的时候使用双引号,例如: String a = “alice”,如果使用String的构造方法String(String)这时JVM并不会将创建的对象放到String Pool当中,而是在heap中的其他位置分配空间去创建String对象.
可以看如下的小例子:
public class StringPool {
public static void main(String[] args) {
String a = "Alice"; //String Pool
String b = "Bob"; //String Pool
String a1 = "Alice"; //String Pool
String b1 = new String("Bob"); // heap but not in string pool
System.out.println("a == a1 ? " + (a == a1));
System.out.println("b == b1 ? " + (b == b1));
}
}
执行的结果:
a == a1 ? true
b == b1 ? false
下面的图描述的不同创建方式所分配的内存空间的策略: