天天看點

[細說Java](3)建立字元串是使用" "還是構造函數?

在java中,可以使用兩種方式建立字元串:

<code>string x = "abc";</code>

<code>string y = new string("abc");</code>

對于這兩種方式(雙引号,構造函數)它們到底有什麼差別呢?

1. 雙引号 vs 構造函數

這個問題可以使用這兩個簡單代碼執行個體來回答:

執行個體一

<code>string a = "abcd";</code>

<code>string b = "abcd";</code>

<code>system.out.println("a == b : "+(a == b)); // true</code>

<code>system.out.println("a.equals(b) : "+(a.equals(b))); // true</code>

a== b等于true 是因為x和y指向方法區中同一個字元串常量,記憶體引用是相同的。

當相同的字元串常量被多次建立時,隻會儲存字元串常量的一份副本,這稱為“字元串駐留”。在java中,所有編譯時字元串常量都是駐留的。

執行個體二

<code>string c = new string("abcd");</code>

<code>string d = new string("abcd");</code>

<code>system.out.println("c == d : "+(c == d)); // false</code>

<code>system.out.println("c.equals(d) : "+(c.equals(d))); // true</code>

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

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

[細說Java](3)建立字元串是使用&amp;quot; &amp;quot;還是構造函數?

2. 運作時字元串駐留

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

<code>string c = new string("abcd").intern();</code>

<code>string d = new string("abcd").intern();</code>

<code>system.out.println("c == d : "+(c == d)); // true</code>

<code>system.out.println("c.equals(d) : "+(c.equals(d))); // true (jdk1.7)</code>

如果字面值“abcd”已經是字元串類型,那麼使用構造函數方式隻會建立一個額外沒有用處的對象。

是以,如果你隻需要建立一個字元串,你可以使用雙引号的方式,如果你需要在堆中建立一個新的對象,你可以選擇構造函數的方式。

原文連結:create java string using ” ” or constructor?