java-字符串

字符串在開發中非常常見,瞭解String是非常有必要的,還能提升系統性能。

(一)不可變性

String一旦創建無法修改,不可變性在多線程中不需要鎖和同步,能提升系統性能。

String s = "123" + "456" + "789";
相當於先生成123456對象,再拼接生成123456789。但編譯過程中,編譯器自己優化,用反編譯查看,該句已轉換爲

String s = "123456789";

(二)存放位置

String常量存放於內存中的常量池,使用享元模式複用相同的字符串,減少內存佔用。

String s1 = "123";
String s2 = "123";
System.out.println(s1==s2);//true


(三)StringBuilder和StringBuffer

String是不可變的,如果字符串常拼接需要使用StringBuilder或StringBuffer,儘管編譯器經常會優化,但是並不經常高效。

StringBuffer是線程安全的,StringBuilder線程不安全,但是效率更高。

/**
 * String測試
 * 
 * @author peter_wang
 * @create-time 2014-9-15 下午2:52:02
 */
public class StringThreadDemo
    implements Runnable {
    private StringBuilder sBuilder = new StringBuilder();
    private StringBuffer sBuffer = new StringBuffer();

    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args)
        throws InterruptedException {
        StringThreadDemo demo = new StringThreadDemo();
        for (int i = 0; i < 10000; i++) {
            Thread thread = new Thread(demo);
            thread.start();
        }
        // 主線程休息3秒鐘等子線程執行完
        Thread.sleep(3000);
        System.out.println("StringBuilder length:" + demo.sBuilder.length() + ",StringBuffer length:" +
            demo.sBuffer.length());
    }

    @Override
    public void run() {
        sBuilder.append("1");
        sBuffer.append("1");
    }

}
運行結果如下:

StringBuilder length:9974,StringBuffer length:10000
查看源碼發現StringBuilder和StringBuffer都繼承AbstractStringBuilder,調用父類append,但是StringBuffer有synchronized。

public AbstractStringBuilder append(String str) {
        if (str == null)
            str = "null";
        int len = str.length();
        if (len == 0)
            return this;
        int newCount = count + len;
        if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(0, len, value, count);
        count = newCount;//count線程不安全,可能導致計算錯誤String長度不對
        return this;
    }






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章