Java中字符串操做類String、StringBuffer、StringBuilder區別及性能對比測試

    java中對字符串的修改操做能夠說是很是常見的,若是涉及到頻繁的字符串修改操做,常常被建議採用StringBuilder和StringBuffer,確定不用String類,緣由在於 StringBuilder和StringBuffer不是final修飾的,它們是可變的,而String是不可變化的,所以每次對String對象進行修改操做都是經過拷貝複製String對象而後進行操做,性能上天然大打折扣。java

    而StringBuilder和StringBuffer,它門都不是final的,運行頻繁在原對象上進行修改。確定有人會問,StringBuilder和StringBuffer有什麼區別呢?就一句話,StringBuffer和StringBuilder的方法基本上是同樣的,惟一的區別是StringBuffer是線程安全的,而StringBuilder不是。安全

    這裏寫一個程序分別用String、StringBuilder和StringBuffer,三種對象方法來對字符串添加的操做。看看分別耗時多少,上一段提到StringBuilder不是線程安全,StringBuffer是線程安全,這裏咱們暫時無論線程安全性。線程安全,意味着有代價,那就是要慢一些。下面的例子,能夠證實三種類對字符串添加操做的速度快慢對比。app

代碼部分
public class StringEntities {
    private static final int COUNTS = 10000;


    /***
     * 測試String複製添加操做時間
     */
    public static void testString(){
        System.out.print("Start to test String -> ");
        long startTime = System.currentTimeMillis();
        String strResult = "";
        for(int i = 0; i< COUNTS; i++){
            strResult += i;
        }
        long endTime = System.currentTimeMillis();
        // 統計循環整個過程時間
        System.out.println("Total time of String operation i: "+ (endTime - startTime));
    }

    /**
     * 測試StringBuffer複製添加操做時間
     */
    public static void testStringBuffer(){
        System.out.print("Start to test StringBuffer -> ");
        long startTime = System.currentTimeMillis();
        StringBuffer strResult = new StringBuffer();
        for(int i = 0; i< COUNTS; i++){
            strResult.append(i);
        }
        long endTime = System.currentTimeMillis();
        // 統計循環整個過程時間
        System.out.println("Total time of StringBuffer operation is: "+ (endTime - startTime));
    }

    /**
     * 測試StringBuffer複製添加操做時間
     */
    public static void testStringBuilder(){
        System.out.print("Start to test StringBuilder -> ");
        long startTime = System.currentTimeMillis();
        StringBuilder strResult = new StringBuilder();
        for(int i = 0; i< COUNTS; i++){
            strResult.append(i);
        }
        long endTime = System.currentTimeMillis();
        // 統計循環整個過程時間
        System.out.println("Total time of StringBuilder operation is:: "+ (endTime - startTime));
    }
}
public class Main {

    public static void main(String[] args) {
        StringEntities.testString();
        StringEntities.testStringBuffer();
        StringEntities.testStringBuilder();

    }
}
運行結果
Start to test String -> Total time of String operation i: 1182
Start to test StringBuffer -> Total time of StringBuffer operation is: 19
Start to test StringBuilder -> Total time of StringBuilder operation is:: 3

     結論就是,從操做效率來看:StringBuilder > StringBuffer > String。 StringBuffer相對線程安全,所以在性能上相比StringBuilder有所微小損耗。

相關文章
相關標籤/搜索