2010-09-06 98 views
14

String str = new String("SOME")String str="SOME" 這兩個聲明是否會影響性能?Java String聲明

+0

另請參閱http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly和http://stackoverflow.com/questions/390703/what-is-the-purpose-of -the-expression-new-string-in-java – polygenelubricants 2010-09-06 17:41:59

回答

29
String str = new String("SOME") 

總是在堆上創建一個新的對象

String str="SOME" 

使用String pool

試試這個小例子:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

爲了避免在堆上使用創建unnecesary對象第二種形式。

9

兩者之間有一個小的差異。

第二聲明assignates關聯到恆定SOME到可變str

首先聲明參考創建具有用於值恆定SOME的值的新的字符串和其assignates參照可變str

在第一種情況下,創建了第二個字符串,其值與SOME的值相同,這意味着更多的初始化時間。因此,你應該避免它。此外,在編譯時,所有常量SOME都被轉換成相同的實例,這使用的內存少得多。

因此,總是比較喜歡第二種語法。

+3

爲了記錄,有些情況下'new String(String)'是有意義的,就像你有一個非常大的字符串一樣,而你只關心保留一個小的子字符串。 'substring'方法只返回原始字符串的flyweight視圖,所以使用'new String(hugeString.substring(a,b))'強制一個副本,並讓GC在它退出時回收'hugeString'的內容範圍。他們不應該讓它成爲構造函數,儘管... – gustafc 2010-09-06 15:16:32

+0

確實有趣的優化案例,但在完成一些分析器檢查之前我不會走這條路(我想你會這樣)。 – Riduidel 2010-09-06 15:41:38

0

第一個將在堆中創建新的String對象,str將引用它。另外文字也將被放置在字符串池中。這意味着將創建2個對象並創建1個參考變量。

第二個選項將只在池中創建String文字,str將引用它。因此只會創建1個對象並創建1個引用。該選項將始終使用String pool中的實例,而不是在每次執行時都創建一個新實例。