Java中String.format和+運算符對比

在拼接字符串時我們通常會有兩種方法,一種是用String類重載‘+’運算符進行拼接,本質上是調用StringBuilder.append。還有一種類似C的printf風格,調用String.format(),底層是調用formatter.format方法。那從性能和內存占用兩個方面考慮到底是哪一個方法更好呢?

做了一個小小的實驗.注意測試的時候注釋掉非測試方法,免得內存占用會被其他的方法影響.

class StringTest {

    public static void main(String[] args) {
       //  testOperatorPlus();
        //testAppend();
       testFormat();
    }

    private static void testFormat() {
        Runtime runtime = Runtime.getRuntime();
        long memory;
        long prev_time;
        int i;
        long time;
        StringBuilder sb = new StringBuilder();
        memory = runtime.freeMemory();
        prev_time = System.currentTimeMillis();
        for (i = 0; i < 10000; i++) {
            String s = String.format("Blah %d Blah %d Blah %d", i, i, i);
        }
        long ww=runtime.freeMemory();
        time = System.currentTimeMillis() - prev_time;
        memory = memory - ww;
        System.out.println("Time: " + time + "    Memory Usage: " + memory);
    }

    private static void testAppend() {
        Runtime runtime = Runtime.getRuntime();
        long memory;
        long prev_time;
        int i;
        long time;
        StringBuilder sb = new StringBuilder();
        memory = runtime.freeMemory();
        prev_time = System.currentTimeMillis();
        for (i = 0; i < 10000; i++) {
            sb.append("Blah ");
            sb.append(i);
            sb.append("Blah ");
            sb.append(i);
            sb.append("Blah ");
            sb.append(i);
        }
        time = System.currentTimeMillis() - prev_time;
        memory = memory - runtime.freeMemory();
        System.out.println("Time: " + time + "    Memory Usage: " + memory);
    }

    private static void testOperatorPlus() {
        Runtime runtime = Runtime.getRuntime();
        long memory;
        long prev_time;
        int i;
        long time;
        StringBuilder sb = new StringBuilder();
        memory = runtime.freeMemory();
        prev_time = System.currentTimeMillis();
        for (i = 0; i < 1000000; i++) {
            String s = "Blah " + i + "Blah " + i + "Blah " + i;
        }
        time = System.currentTimeMillis() - prev_time;
        memory = memory - runtime.freeMemory();
        System.out.println("Time: " + time + "    Memory Usage: " + memory);
    }
}

結果如下:

Method Time(ms) Memory Usage(long)
‘+’ operator 115 28805400
StringBuilder.append 14 884768
String.foramt 276 23175080

可以看到StringBuilder.append的執(zhí)行時間和內存占用都是最優(yōu)的。'+'運算符比直接調用StringBuilder.append要慢上不少,特別是要連接的字符串數量較多時,內存占用也特別大。String.format由于每次都有生成一個Formatter對象,較慢也是情理之中。

PS:測試數據少且缺少對比實驗,結論適用性有限,僅供參考。
另見:http://stackoverflow.com/q/925423/5032462

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 集合框架: 1)特點:存儲對象;長度可變;存儲對象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,386評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • 轉自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,806評論 3 93
  • 今天看的視頻和聽的教育很有觸動。審視自己的內心,聯系到自己日常的點點滴滴,有吃驚加后怕而且慶幸的感覺。 有時結果和...
    放松放開放下閱讀 378評論 5 3
  • 上午的物流實驗課起到了近乎完美地將我催眠的作用,從八點到十一點,效力逐漸加重??諝馔T窗禁閉的教室里,窗簾拉緊...
    yangzhian閱讀 263評論 0 0

友情鏈接更多精彩內容