1. 程式人生 > 實用技巧 >JavaSE學習筆記12:常用類之StringBuffer與StringBuilder

JavaSE學習筆記12:常用類之StringBuffer與StringBuilder

常用類之StringBuffer

StringBuffer

問:在實際的開發中,如果需要進行字串的頻繁拼接,會有什麼問題?
答:因為java中的字串是不可變的,每一次拼接都會產生新字串,
這樣會佔用大量的方法區記憶體,造成記憶體空間的浪費
String s = "abc";
s += "hello"
就以上兩行程式碼,就導致在方法區字串常量池當中建立了3個物件
"abc"、"hello"、"abchello"

public class StringBufferTest01 {
    public static void main(String[] args) {
        String s = "";
        //這樣做會給java的方法區字串常量池帶來很大的壓力
        for (int i = 0; i < 100; i++) {
            s += i;
            System.out.println(s);
        }
        /*  執行結果:
            0
            01
            012
            0123
            01234
            ...
         */
    }
}

如果以後需要進行大量字串的拼接操作,建議使用JDK中自帶的:
java.lang.StringBuffer
java.lang.StringBuilder

注意:

  1. StringBuffer底層實際上是一個byte[]陣列
  2. 往StringBuffer中放字串,實際上是放到byte陣列當中了
  3. StringBuffer的初始容量是16
package se2.stringBuffer;
/*
如何優化StringBuffer的效能?
    在建立StringBuffer的時候儘可能給定一個初始化容量
    最好減少底層陣列的擴容次數,預估計一下,給一個大一些的初始化容量
    關鍵點:給定一個合適的初始化容量,可以提高程式的執行效率
 */
public class StringBufferTest02 {
    public static void main(String[] args) {
        //建立一個初始化容量為16的byte[]陣列(字串緩衝區物件)
        StringBuffer stringBuffer = new StringBuffer();
        //拼接字串,以後拼接字串統一呼叫append()方法
        //append是追加的意思
        stringBuffer.append("a");
        stringBuffer.append("b");
        stringBuffer.append("c");
        stringBuffer.append(3.14);
        stringBuffer.append(true);
        //append方法底層在進行追加的時候,如果byte陣列滿了,會自動擴容
        stringBuffer.append(100L);

        System.out.println(stringBuffer);//abc3.14true100
        //System.out.println(stringBuffer.toString());

        //指定初始化容量為100的StringBuffer物件(字串緩衝區物件)
        StringBuffer sb = new StringBuffer(100);
        sb.append("hello");
        sb.append("world");
        sb.append("hello");
        sb.append("kitty");
        System.out.println(sb);//helloworldhellokitty
    }
}

StringBuilder

package se2.stringBuffer;
/*
StringBuffer和StringBuilder的區別
    StringBuffer中的方法都有:synchronized關鍵字修飾,表示StringBuffer在多執行緒環境下執行是安全的
    StringBuilder中的方法都沒有:synchronized關鍵字修飾,表示StringBuilder在多執行緒環境下執行是不安全的
    
    StringBuffer是執行緒安全的
    StringBuilder是非執行緒安全的
 */
public class StringBuilderTest01 {
    public static void main(String[] args) {
        //使用StringBuilder也是可以完成字串的拼接
        StringBuilder sb = new StringBuilder();
        sb.append(100);
        sb.append(true);
        sb.append("hello");
        sb.append("kitty");
        System.out.println(sb);
    }
}