String创建有如下两种方式:
// 方式一
String s1 = "abc";
// 方式二
String s2 = new String("abc");
System.out.println(s1 == s2); // false
方式一在创建的时候JVM会先在字符串常量池中检索字符串内容是否存在,若存在则直接返回对应的引用,若不存在则在堆中创建一个String对象,其值为abc,同时将该对象的引用缓存在字符串常量池中以便以后重用,接着返回该对象的引用给s1。方式二在创建的时候会先在堆中创建一个String对象,其值为abc,接着返回该对象的引用给s2。
字符串常量池:
Java的字符串常量池是JVM专门指定的特殊内存区域,用来存储字符串字面量。在Java7之前,分配在JVM的方法区中,属于常量池的一部分。在Java7之后字符串常量池被移到堆内存中,以便JVM进行垃圾回收。