Programcreek -Java基礎之String---用""仍是用new String("")

Java裏能夠用兩種方法來建立一個String: java

String x = "abc";
String y = new String("abc");

這兩種方法有什麼不一樣? jvm

1. 雙引號 Vs. 構造函數 函數

用兩個簡單的代碼來回答這個問題。 spa

Example 1: .net

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

在JVM 方法區,a和b指向同一個String字面量,內存引用是相同的,因此a==b。 code

當建立多個相同的String字面量時,只有一個相同的String字面量被保存下來。這稱爲字符串的駐留(string interning)。Java 中全部常量String都會自動被駐留。 orm

Example 2: 對象

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

JVM堆heap中c和d指向兩個不一樣的對象,因此c==d值爲假。不一樣的對象有不一樣的內存引用。 blog

下圖演示了這兩種情景: 內存

2. 運行期字符串駐留String Interning

即便兩個String是用構造函數(new String(""))構建,在運行期也會執行字符串駐留。

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True



3. 如何使用

若是僅僅須要建立一個字符串,你須要使用雙引號方式建立字符串。若是你須要在堆裏新建立一個字符串對象時,能夠考慮使用構造函數方式建立字符串。這裏有個構造函數用例參考。

原文:http://www.programcreek.com/2014/03/create-java-string-by-double-quotes-vs-by-constructor/

字符串駐留參考:

http://blog.csdn.net/biaobiaoqi/article/details/6892352

http://java-performance.info/string-intern-in-java-6-7-8/

相關文章
相關標籤/搜索