java placeholder_Java占位符

标签:

一、背景

在使用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}

参考:

标签:

来源: https://www.cnblogs.com/huanyou/p/9652613.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值