Java 字符串 - "Java" 和 new String("Java") 有什么区别?

Java Strings - What is the difference between "Java" and new String("Java")?

鉴于此示例代码:

class basic {
     public static void main(String[] args) {
        String s1 = "Java";
        String s2 = new String("Java");
    }
}

s1s2都是对象的引用变量吗? 这两行代码做同样的事情吗?

第 3、4 行不做同样的事情,如:

String s1 = "Java"; 可以重用 string constant pool 中的一个实例(如果可用),而 new String("Java"); 会创建一个新的引用不同的 String 对象实例。

因此,第 3 行和第 4 行不做同样的事情。

现在,让我们看一下下面的代码:

String s1 = "Java";
String s2 = "Java";

System.out.println(s1 == s2);      // true

s2 = new String("Java");
System.out.println(s1 == s2);      // false
System.out.println(s1.equals(s2)); // true

== 对两个引用类型进行引用标识比较。两个相等的对象不一定是==。通常,在引用类型上使用==是错误的,大多数时候需要使用equals来代替。

使用 new 关键字初始化字符串 String s2 = new String("Java"); 在内存堆中创建一个新对象。通过该方法初始化的字符串是可变的,意思是字符串的值在初始化后可以重新赋值。
String s1 = "Java" 使用 Literal 的直接 String 初始化会在内存池区域创建一个对象。通过 Literal 创建的字符串不会创建新对象。它只是将引用传递给之前创建的对象。