天道不一定酬所有勤
但是,天道只酬勤

該如何創建字符串,使用” “還是構造函數?

在Java中,有兩種方式可以創建字符串:

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

使用雙引號和構造函數之間到底有什么區別呢?

雙引號 vs 構造函數

這個問題可以使用這兩個簡單代碼實例來回答:

實例一

String a = "abcd";
String b = "abcd";
System.out.println("a == b : "+(a == b)); // true
System.out.println("a.equals(b) : "+(a.equals(b))); // true

a== b等于true 是因為x和y指向方法區中同一個字符串常量,他們的引用是相同的(==比較的是引用)。

當相同的字符串常量被多次創建時,只會保存字符串常量的一份副本,這稱為“字符串駐留”。在Java中,所有編譯時字符串常量都是駐留的。

實例二

String c = new String("abcd");
String d = new String("abcd");
System.out.println("c == d : "+(c == d)); // false
System.out.println("c.equals(d) : "+(c.equals(d))); // true

c== d等于false 是因為c和d指向堆中不同的對象。不同的對象擁有不同的內存引用。

下面圖論證了以上的結論。

string

運行時字符串駐留

運行時也會發生字符串駐留,即使兩個字符串是由構造函數方法創建的。

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println("c == d : "+(c == d)); // true
System.out.println("c.equals(d) : "+(c.equals(d))); // true    (JDK1.7)

因為字面值“abcd”已經是字符串類型,那么使用構造函數方式只會創建一個額外沒有用處的對象。

因此,如果你只需要創建一個字符串,你可以使用雙引號的方式,如果你需要在堆中創建一個新的對象,你可以選擇構造函數的方式。

(全文完) 歡迎關注『Java之道』微信公眾號
贊(3)
如未加特殊說明,此網站文章均為原創,轉載必須注明出處。HollisChuang's Blog » 該如何創建字符串,使用” “還是構造函數?
分享到: 更多 (0)

評論 1

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
  1. #1

    第二幅圖中,在 JAVA 1.7,堆中存的不是 abcd ,而是一個引用指向字符串常量池中的 abcd 吧?

    北侖色2年前 (2018-03-30)回復

HollisChuang's Blog

聯系我關于我
大乐透复式返奖 辽宁11选5胆拖玩法 配资公司配资不亏吗 辽宁体彩十一选五一牛 通昭配资 排五带线走势图专业版 黑龙江22选5走势图2元网 黑龙江11选五前三组走势图 河北福彩排列7 福建快3开奖结果多少钱 炒股是什么意思啊?