原文地址
正如名字所示:Java中字符串池存储在堆内存中。我们知道java中String是一个特殊的类,我们可以通过new 操作符或者使用双引号“”创建一个String对象。
下面是一个图,清晰的解释了java堆内存怎么管理字符串池的。以及当我们使用不同的方式创建字符串时发生了什么。
字符串池是可行的,只是因为在Java中String是不可变类型的。而且它实现了字符串的interning 概念。
字符串池是享元设计模式的一个实例。
字符串池有助于为Java运行时节省了很多的内存空间,即使它使用了更多的时间。
当我们使用双引号创建字符串时,它首先在字符串池中寻找同样值的字符串,如果找到了就返回该引用。如果没找到,就在池中创建一个新的字符串并返回它的引用。
然而使用new操作符创建字符串时,我们强制String类在堆内存上创建一个新的String对象。我们可以使用intern() 方法将它放到String池中。或者指向字符串池中有相同值字符串对象的引用。
下面是java程序:
package com.journaldev.util;
public class StringPool {
/** * Java String Pool example * @param args */ public static void main(String[] args) { String s1 = "Cat"; String s2 = "Cat"; String s3 = new String("Cat"); System.out.println("s1 == s2 :"+(s1==s2)); System.out.println("s1 == s3 :"+(s1==s3)); }
}
上面程序输入如下:
s1 == s2 :true
s1 == s3 :false
推荐阅读: Java String Class
有时候在Java面试中,你可能被问到关于字符串池的问题,比如,下面的语句创建了几个string.
String str = new String("Cat");
在上面的语句中,1个或者2个string被创建了,如果字符串池中已经有’cat‘字符串了,就只创建一个String.如果字符串池中没有’cat‘字符串,首先在字符串池中创建一个字符串,然后在堆内存中创建一个字符串,所有总共有2个string对象被创建了。