字符串技術選型

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進行字符串的拼接

相關文章
相關標籤/搜索