- 字符串常量池
JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。
- 具体实现
当代码中出现字符串时,JVM首先会对其进行检查。
①、如果字符串常量池中存在相同内容的字符串对象,则将这个对象的地址返回。
②、如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池。
class T1 {
public String s1 = "test";
}
class T2 {
public String s2 = "test";
}
public class StringTest {
public static void main(String[] args) {
System.out.println(new T1().s1 == new T2().s2); //true
}
}
new String("test")时,首先也会去检查常量池是否存在“test”(存在则不创建、不存在则在常量池先创建一个),然后在堆空间再开辟一块内存区域创建字符串对象 。
- 实现前提
java中String对象是不可变的(使用final修饰),这样可以安全保证多个变量共享同一个对象。如果String对象可变,一个引用改变了对象的值,那么其他变量的值也会跟着受影响,显然不合理。