Java占位符
阿新 • • 發佈:2018-09-16
build 格式化 plus {0} clas 魔法 get sage span
一、背景
在使用java開發的過程中,經常需要使用將字符串拼接到一起(比如,用於日誌輸出),常用方法如下:
- 使用+將不同字符串進行拼接
- 使用StringBuilder
- 使用String.format
- 使用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占位符