String,StringBuffer,StringBuilder三者性能對比


編譯環境:OpenJDK 11
先上代碼:

public class Test {
    public static void main(String[] args) {
        final int n = Integer.parseInt(args[0]);
        System.out.println("String:" + getTime(getStringTime(n)));
        System.out.println("StringBuffer:" + getTime(getStringTime(n)));
        System.out.println("StringBuilder:" + getTime(getStringTime(n)));
    }

    static String getTime(long time) {
        return Double.toString((double) time / 1000);
    }

    static long getStringTime(int times) {
        String string = "";
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < times; i++) {
            string += ' ';
        }
        long t2 = System.currentTimeMillis();
        return t2 - t1;
    }

    static long getStringBufferTime(int times) {
        StringBuffer stringBuffer = new StringBuffer();
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < times; i++) {
            stringBuffer.append(' ');
        }
        long t2 = System.currentTimeMillis();
        return t2 - t1;
    }

    static long getStringBuilderTime(int times) {
        StringBuilder stringBuilder = new StringBuilder();
        long t1 = System.currentTimeMillis();
        for (int i = 0; i < times; i++) {
            stringBuilder.append(' ');
        }
        long t2 = System.currentTimeMillis();
        return t2 - t1;
    }
}

String,StringBuffer,StringBuilder各循環1000000次,兩次測試結果分別如下圖所示

在自己的電腦上測試的結果(CPU:i7 9700)

i7 9700

在ECS服務器上測試的結果(CPU:雲ECS學生機1核CPU)

1c

結論:String,StringBuffer和StringBuilder在現代處理器單線程下性能差異並不大,后兩者性能略高於String,而由於String在自增過程中是存在新建對象操作的,所以占用內存方面大於后兩者,同時由於產生了垃圾對象,gc也會造成一定的計算開支。因此處理可變長字符串時,在單線程應用場景下應使用StringBuilder獲得更高性能,而在多線程應用場景下應使用StringBuffer來確保線程安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM