## 字符串常量池   Java 中字符串对象创建有两种形式,一种为字面量形式,如`String str = "abc";`,另一种就是使用 new 这种标准的构造对象的方法,如`String str = new String("abc");`,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而**这两种实现其实存在着一些性能和内存占用的差别**。这一切都是源于 JVM 为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为**字符串常量池**或者**字符串字面量池**。 **工作原理**   当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。 ~~~java public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; // 以上两个局部变量都存在了常量池中 System.out.println(s1 == s2); // true // new出来的对象不会放到常量池中,内存地址是不同的 String s3 = new String(); String s4 = new String(); /** * 字符串的比较不可以使用双等号,这样会比较内存地址 * 字符串比较应当用equals,可见String重写了equals */ System.out.println(s3 == s4); // false System.out.println(s3.equals(s4)); // true } } ~~~