String.intern()、String、StringBuilder和StringBuffer

1. String.intern()

????????看《深入理解Java虛擬機》提到運行時常量池(Runtime Constant Pool),運行時常量池是方法區的一部分,是存儲什么的呢?
??????? Class文件中除了有類的版本、字段,方法、接口等信息,還有常量池信息-Class文件常量池,存放了編輯期生成的各種字面量和符號引用,那么這些東西在類加載后就會被存放到方法區的運行時常量池中。
???????運行時常量池有個特性是具備動態性,java語言并不要求常量一定在編譯期間產生,也就是除了上面說的編譯期間產生的Class文件中的常量,運行期間也可能有新的常量產生并放入常量池,比較多的實際例子就是String類的intern()方法。
???????關于intern()的解釋,《Java編程思想》里的解釋是:為每一個字符序列生成且僅生成一個String引用,比較籠統,這里轉載一篇比較清楚的blog:幾張圖輕松理解String.intern()

2. String與StringBuilder
  • String對象不可變

???????String對象是不可變的,也即是任何看起來會修改String值的方法,實際都是創建了一個全新的對象,該對象包含了更改后的字符串內容,最初的對象不會受到改變。

  • 重載“+”與StringBuilder

???????用于String的“+”和“+=”是java中僅有的兩個重載過的操作符,因為java不允許程序員重載任何操作符。那么重載的“+”是做了什么優化么?

String mango = "mango";
String s = "abc" + mango + "def" + 47;

???????按照String的不變性,直觀上上述代碼在s的生成過程中每次+操作都會產生臨時的一個String對象來存儲中間結果,將會產生很多需要垃圾回收的中間對象,性能就不能保證了。然而實際上編輯器會自己優化這個操作,它會創建一個StringBuilder對象,每次+會調用append()方法,總計共四次,最后調用toString()生成最終結果存入s。
???????但是不要以為任何情況編輯器都會做出最好的優化,如果你的+或者+=是在循環中使用,那么StringBuilder的創建也是會在循環體里面,具體的例子可參看《Java編程思想》Ch13字符串。

3. StringBuilder

???????StringBuilder是Java SE5引入的,在這之前Java用的是StringBuffer,后者是線程安全的,因此開銷會大一些。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。