1. 程式人生 > >Java占位符

Java占位符

build 格式化 plus {0} clas 魔法 get sage span

一、背景

  在使用java開發的過程中,經常需要使用將字符串拼接到一起(比如,用於日誌輸出),常用方法如下:

  1. 使用+將不同字符串進行拼接
  2. 使用StringBuilder
  3. 使用String.format
  4. 使用MessageFormat.format

二、4種方式性能對比

  上面4中方式,性能方面孰優孰劣,可以做如下驗證:

    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        int count = 1000000;
        
for (int i = 0; i < count; i++) { String s = "Hi " + i + "; Hi to you " + i * 2; } long end = System.currentTimeMillis(); System.out.println("Concatenation = " + ((end - start)) + " millisecond"); start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { String s
= String.format("Hi %s; Hi to you %s", i, +i * 2); } end = System.currentTimeMillis(); System.out.println("Format = " + ((end - start)) + " millisecond"); start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { String s = MessageFormat.format("Hi %s; Hi to you %s", i, +i * 2); } end
= System.currentTimeMillis(); System.out.println("MessageFormat = " + ((end - start)) + " millisecond"); start = System.currentTimeMillis(); for (int i = 0; i < count; i++) { StringBuilder bldString = new StringBuilder("Hi "); bldString.append(i).append("; Hi to you ").append(i * 2).toString(); } end = System.currentTimeMillis(); System.out.println("StringBuilder = " + ((end - start)) + " millisecond"); }

  得到結果如下:

Concatenation = 141 millisecond
Format = 1880 millisecond
MessageFormat = 383 millisecond
StringBuilder = 142 millisecond

  將count的值增加10倍,到10000000,得到結果如下:

Concatenation = 1379 millisecond
Format = 18944 millisecond
MessageFormat = 3690 millisecond
StringBuilder = 1487 millisecond

  從上面的實驗中可以得到如下結論

  1、使用+和StringBuilder效率最高;MessageFormat效率次之,大約相當於前面兩種方式的3倍左右;String.format效率最差,差出10倍不止。

  

三、占位符

  後兩種方式需要使用占位符,而且使用的占位符格式不相同。

  1、String.format

    解析占位符的方式為正則表達式,使用占位符格式為:%1$s,%2$s。

  占位符完整格式為: %[index$][標識]*[最小寬度][.精度]轉換符 。

  針對不同數據類型的格式化,占位符的格式將有所裁剪。

  % ,占位符的其實字符,若要在占位符內部使用%,則需要寫成 %% 。

  [index$] ,位置索引從1開始計算,用於指定對索引相應的實參進行格式化並替換掉該占位符。

  [標識] ,用於增強格式化能力,可同時使用多個 [標識] ,但某些標識是不能同時使用的。

  [最小寬度] ,用於設置格式化後的字符串最小長度,若使用 [最小寬度] 而無設置 [標識] ,那麽當字符串長度小於最小寬度時,則以左邊補空格的方式湊夠最小寬度。

  [.精度] ,對於浮點數類型格式化使用,設置保留小數點後多少位。

  轉換符 ,用於指定格式化的樣式,和限制對應入參的數據類型。

  

  2、MessageFormat.format

    解析占位符的方式為逐字符掃描,找到大括號做標記,使用占位符格式為:{0},{1}

參考:

  Java魔法堂:String.format詳解

  MessageFormat vs String plus性能對比

Java占位符