在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指向堆中不同的對象。不同的對象擁有不同的記憶體引用。
下面圖論證了以上的結論。
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?