工作中遇到字符串相關的BUG,OOM了,所以去看了下崩潰的日誌,在Array類中,數組的崩潰,於是詳細的查閱了一下Java字符串中的工作原理,就是下面的這個圖啦,轉載自最後的鏈接博客。
簡單總結下:
1)String str = "a"
這種字符串,是在編譯期作爲一個常量保存在字符串常量池的,本質上是個Char[] 數組。
如果又String str2 ="a" ,因爲之前字符串常量池中有這個常量,那麼會複用,(反正是常量又不會變化)
2)String str = new String("a")
這種在裝載期在常量池創建"a" 對象,在運行期創建String對象,字符串常量池並沒有。如果對String 使用 intern()這個會與字符串常量池中建立聯繫,沒有會創建常量,有會複用常量。
3)字符串拼接:
String c = "a"+"b"; 在編譯器的時候會作爲一個整體常量來編譯。
在運行期拼接字符串其實都是StringBuilder,而“+”則會重複創建丟棄Stringbuider,故而效率會低
StringBuffer,和StringBuilder,都是在堆區域的對象,是可以變的類似。只是在StringBuffer中加了synchronized 鎖線程安全,效率也低了下來。
https://www.cnblogs.com/xiaoxi/p/6036701.html