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/