2013-03-26 52 views
2

我讀到關於Java的最佳做法的一些建議,我得到了這讓我很好奇最佳實踐好奇心

此外,每當你想實例化一個String對象,從來沒有使用它的構造函數,但總是實例如下想法它直接。

例如:

//slow instantiation 
String slow = new String("Yet another string object"); 

//fast instantiation 
String fast = "Yet another string object"; 

這是爲什麼?不'快速'調用默認的字符串構造函數?

+4

第二種或「快速」方法只創建一個字符串,如果它尚未被實施 – Reimeus 2013-03-26 19:54:49

+2

看看這個:http://stackoverflow.com/questions/2009228/strings-are-objects-in -java那麼爲什麼 - 不要 - 我們使用新到創造,他們 – 2013-03-26 19:55:15

回答

5

當您使用new你得到一個新的字符串對象,但如果你使用字符串字面然後see here

在計算機科學中,字符串實習是隻存儲一個 副本的方法每個不同的字符串值,必須是不可變的。實際上, 字符串會使一些字符串處理任務更具時間效率 - 或 節省空間,但需要花費更多時間創建或實施字符串 。不同的值存儲在字符串實習生 池中。每個字符串的單個副本稱爲其「實習」,通常通過字符串類的方法查找 ,例如 Java中的String.intern()。 Java中的所有編譯時常量字符串都是使用此方法自動實現的 。

如果你這樣做:

String a = "foo"; 
String b = "foo"; 

然後a==b

一個字符串將是創建只有當它沒有被實施。 對象將在第一次創建,它將被存儲在一個名爲字符串常量池的地方。

但是使用將爲每個字符串創建不同對象的new將輸出false

String a = new String("foo"); 
String b = new String("foo"); 

現在a==b

所以當使用literal時,它更容易閱讀,並且編譯器更容易進行優化。所以......儘可能地使用它。

1

JVM維護一組String文字用於優化。當您使用構造函數創建一個String

String s1 = new String("foo"); 

String對象被創建,和字面"foo"被添加到池中。在此之後,無論何時在代碼中使用"foo""foo"都會引用池中的項目,並且不會創建新對象。由於String是不可變的,所以這不會產生任何問題。

所以,當你使用「快捷方式」創建String

String s2 = "foo" 

的JVM看起來入池,如果"foo"已經存在那裏,它將使s2指項目在游泳池。

這是一個與可能的性能影響的主要區別:構造函數總是創建一個對象,並將該文字添加到池中(如果它尚不存在)。快捷方式指的是池中的項目,並且只有在水池不在池中時才創建新對象。