關於String、StringBuffer、StringBuilder的區別

概述

在日常擼碼中,經常會有字符串的合併,如果數據小還好,如果數據大的話,就會涉及到一個效率的問題。我們經常使用String,但是,實際上還有StringBuffer、StringBuilder。我們來驗證一下它們的效率。累加字符串10000次,比較它們所用的時間。

String

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3;
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            str1 = str1 + "123123123";
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

運行時間爲:time:359

StringBuffer

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3;
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            str2.append("123123123");
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

運行時間爲:time:0

我們把次數加大到100000次

運行時間爲:time:16

StringBuilder

同樣我們把次數加大到100000次

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3 = new StringBuilder();
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            str3.append("123123123");
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

運行時間爲:time:0

我們再次把次數加大到100000次

運行時間爲:time:31

總結

由上面的數據可以看出,拼接字符串的效率是:

String < StringBuffer < StringBuilder

在API文檔中,StringBuffer的介紹是:

線程安全的可變字符序列。

StringBuilder的介紹是:

一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現中,它比 StringBuffer 要快。StringBuilder 的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用 StringBuffer。

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