String str = new String("SOME")
和String str="SOME"
這兩個聲明是否會影響性能?Java String聲明
回答
String str = new String("SOME")
總是在堆上創建一個新的對象
String str="SOME"
試試這個小例子:
String s1 = new String("hello");
String s2 = "hello";
String s3 = "hello";
System.err.println(s1 == s2);
System.err.println(s2 == s3);
爲了避免在堆上使用創建unnecesary對象第二種形式。
兩者之間有一個小的差異。
第二聲明assignates關聯到恆定SOME
到可變str
首先聲明參考創建具有用於值恆定SOME
的值的新的字符串和其assignates參照可變str
。
在第一種情況下,創建了第二個字符串,其值與SOME
的值相同,這意味着更多的初始化時間。因此,你應該避免它。此外,在編譯時,所有常量SOME
都被轉換成相同的實例,這使用的內存少得多。
因此,總是比較喜歡第二種語法。
爲了記錄,有些情況下'new String(String)'是有意義的,就像你有一個非常大的字符串一樣,而你只關心保留一個小的子字符串。 'substring'方法只返回原始字符串的flyweight視圖,所以使用'new String(hugeString.substring(a,b))'強制一個副本,並讓GC在它退出時回收'hugeString'的內容範圍。他們不應該讓它成爲構造函數,儘管... – gustafc 2010-09-06 15:16:32
確實有趣的優化案例,但在完成一些分析器檢查之前我不會走這條路(我想你會這樣)。 – Riduidel 2010-09-06 15:41:38
第一個將在堆中創建新的String對象,str將引用它。另外文字也將被放置在字符串池中。這意味着將創建2個對象並創建1個參考變量。
第二個選項將只在池中創建String文字,str將引用它。因此只會創建1個對象並創建1個引用。該選項將始終使用String pool中的實例,而不是在每次執行時都創建一個新實例。
- 1. Array String聲明
- 2. Char * string []聲明錯誤
- 3. Java IF聲明
- 4. Java聲明
- 5. Java類聲明
- 6. java包聲明
- 7. java stringbuffer聲明
- 8. Java ArrayList聲明
- 9. 聲明String s = new String(「abc」)。intern(); over String s =「abc」(反之亦然)
- 10. 「When」聲明與Java「switch」聲明
- 11. 在Scala中聲明Java Map <String,Object>參數?
- 12. Java的聲明在方法調用一個String數組
- 13. 如何在Java SQL declareParameter調用中聲明一個String數組?
- 14. 是否可以在String中聲明Java中的默認參數?
- 15. 正向聲明std :: string和std :: wstring
- 16. GPathResult爲String沒有XML聲明
- 17. 'string'/'cin'未在此範圍內聲明
- 18. 必須聲明PL/SQL標識符'string'
- 19. C2061'string':未聲明的標識符
- 20. Java變量聲明
- 21. 如果聲明JAVA
- 22. 聲明在Java中
- 23. java變量聲明
- 24. Java方法聲明
- 25. Java - 聲明數組
- 26. Java - 參數聲明
- 27. Int Def聲明Java
- 28. Java類型聲明
- 29. Java變量聲明
- 30. 聲明在java中
另請參閱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