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");
}
}
s1
和s2
都是对象的引用变量吗?
这两行代码做同样的事情吗?
第 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 创建的字符串不会创建新对象。它只是将引用传递给之前创建的对象。
鉴于此示例代码:
class basic {
public static void main(String[] args) {
String s1 = "Java";
String s2 = new String("Java");
}
}
s1
和s2
都是对象的引用变量吗?
这两行代码做同样的事情吗?
第 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 创建的字符串不会创建新对象。它只是将引用传递给之前创建的对象。