在java語言中,可以表示字符串的類有String,StringBuffer,StringBuilder.java
1.從 String,StringBuffer,StringBuilder中選擇合適的技術,進行字符串的拼接(技術選型)面試
-String,StringBuffer,StringBuilder底層都是char數組數組
-String是不可變的字符序列 ,任何對字符串的修改操做,都會建立新的對象,因此在作字符串拼接操做的時候,效率較低,不推薦使用安全
-StringBuffer,StringBuilder繼承了相同的父類 ,是可變的字符序列多線程
-StringBuffer,StringBuilder底層數組默認初始化容量是16併發
-StringBuffer,StringBuilder在拼接的時候,若是超出了16個字符,那麼須要對其進行擴容,大數據
*擴容的新長度 原長度* 2 + 2優化
*擴容方式 數組拷貝 System.arraycopy();該方法前用native修飾,屬於本地方法調用JNI(Java Native Invoke)ui
表示該方法實現的時候,底層調用了其它語言編寫的dll文件(C,C++,VB)spa
*面試題:在使用StringBuffer或者是StringBuilder進行大數據量字符串拼接的時候,如何優化?
改變初始化容量,減小擴容次數,減小數組拷貝的次數...
-StringBuffer是線程安全的 @since JDK1.0 比較老 效率低,併發性差
-StringBuilder是非線程安全的 @since 1.5 比較新 效率高 ,併發性好
1)關於線程安全問題
-多線程
-有共享數據
-對共享數據涉及修改操做
以上條件都知足的狀況下,才須要考慮線程安全的問題
棧:棧內存是線程獨立的,一個線程一個棧. 結論: 局部變量是線程安全的
堆:是被多線程共享的,因此成員變量是非線程安全的
方法區:是被多線程共享的, 因此靜態變量是非線程安全的
2)一旦出現線程安全問題,如何解決?
-儘可能使用局部變量
-若是使用了成員變量,加synchronized修飾,讓線程同步
*synchronized能夠加在方法上,還能夠加在代碼塊上,推薦加在代碼塊上,影響的範圍小一些
-讓線程訪問的對象變爲多例
3)讓線程同步,效率低,併發性差;讓對象變爲多例,耗費堆內存;結論:使用局部變量的StringBuilder進行字符串的拼接