一、背景

  在使用java开发的过程中,经常需要使用将字符串拼接到一起(比如,用于日志输出),常用方法如下:

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

二、4种方式性能对比

  上面4中方式,性能方面孰优孰劣,可以做如下验证:

  1. public static void main(String[] args) throws Exception {
  2. long start = System.currentTimeMillis();
  3. int count = 1000000;
  4. for (int i = 0; i < count; i++) {
  5. String s = "Hi " + i + "; Hi to you " + i * 2;
  6. }
  7. long end = System.currentTimeMillis();
  8. System.out.println("Concatenation = " + ((end - start)) + " millisecond");
  9. start = System.currentTimeMillis();
  10. for (int i = 0; i < count; i++) {
  11. String s = String.format("Hi %s; Hi to you %s", i, +i * 2);
  12. }
  13. end = System.currentTimeMillis();
  14. System.out.println("Format = " + ((end - start)) + " millisecond");
  15. start = System.currentTimeMillis();
  16. for (int i = 0; i < count; i++) {
  17. String s = MessageFormat.format("Hi %s; Hi to you %s", i, +i * 2);
  18. }
  19. end = System.currentTimeMillis();
  20. System.out.println("MessageFormat = " + ((end - start)) + " millisecond");
  21. start = System.currentTimeMillis();
  22. for (int i = 0; i < count; i++) {
  23. StringBuilder bldString = new StringBuilder("Hi ");
  24. bldString.append(i).append("; Hi to you ").append(i * 2).toString();
  25. }
  26. end = System.currentTimeMillis();
  27. System.out.println("StringBuilder = " + ((end - start)) + " millisecond");
  28. }

  得到结果如下:

  1. Concatenation = 141 millisecond
  2. Format = 1880 millisecond
  3. MessageFormat = 383 millisecond
  4. StringBuilder = 142 millisecond

  将count的值增加10倍,到10000000,得到结果如下:

  1. Concatenation = 1379 millisecond
  2. Format = 18944 millisecond
  3. MessageFormat = 3690 millisecond
  4. StringBuilder = 1487 millisecond

  从上面的实验中可以得到如下结论

  1、使用+和StringBuilder效率最高;MessageFormat效率次之,大约相当于前面两种方式的3倍左右;String.format效率最差,差出10倍不止。

  

三、占位符

  后两种方式需要使用占位符,而且使用的占位符格式不相同。

  1、String.format

    解析占位符的方式为正则表达式,使用占位符格式为:%1$s,%2$s。

  1. 占位符完整格式为: %[index$][标识]*[最小宽度][.精度]转换符
  2.  
  3. 针对不同数据类型的格式化,占位符的格式将有所裁剪。
  4.  
  5. % ,占位符的其实字符,若要在占位符内部使用%,则需要写成 %%
  6.  
  7. [index$] ,位置索引从1开始计算,用于指定对索引相应的实参进行格式化并替换掉该占位符。
  8.  
  9. [标识] ,用于增强格式化能力,可同时使用多个 [标识] ,但某些标识是不能同时使用的。
  10.  
  11. [最小宽度] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。
  12.  
  13. [.精度] ,对于浮点数类型格式化使用,设置保留小数点后多少位。
  14.  
  15. 转换符 ,用于指定格式化的样式,和限制对应入参的数据类型。

  

  2、MessageFormat.format

    解析占位符的方式为逐字符扫描,找到大括号做标记,使用占位符格式为:{0},{1}

参考:

  Java魔法堂:String.format详解

  MessageFormat vs String plus性能对比

Java占位符的更多相关文章

  1. Java 占位符使用 和 修饰符

    Java中占位符的使用 String类的format()方法 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法, ...

  2. Android之使用JAVA占位符格式数据(很实用)

    小编虽然是学java出生,但工作之后就一直从事android开发,很多java基础都忘记完了,最近一年从ES换到了AS,原来的很多习惯都收到了挑战,比如我喜欢ES写方法的时候先在JAVA projec ...

  3. Java 占位符

    Java的占位符有两种:% 和 {} String 类对象 只能使用 % 有效. MessageFormat 类对象 只能使用 {} 有效. package demo; import java.tex ...

  4. Java占位符替换工具类

    import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFact ...

  5. java占位符应用

    (转载自:http://www.cnblogs.com/happyday56/p/3996498.html) String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语 ...

  6. java的占位符

    java占位符的类型: 常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.fo ...

  7. Java_占位符使用

    public class t7 { public static void main(String[] args) { // TODO Auto-generated method stub //Java ...

  8. Java C# C语言中的占位符

    一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...

  9. Java使用占位符拼接字符串

    大家知道,在C#编程中,可以用占位符来拼接字符串,用起来非常的方便. 特别是需要进行大量的参数拼接的时候,比如: Console.WriteLine(String.Format("该域名{0 ...

随机推荐

  1. kafka TimeoutException 超时问题解决

    1.报错:: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.NotLeaderForPartition ...

  2. PCB (3)创建新工程PCB

    点击完成 拖进我们创建的工程中

  3. mysql-修改字段类型和修改字段名称

    文章转自:https://blog.csdn.net/u010002184/article/details/79354136 mysql修改字段类型: --能修改字段类型.类型长度.默认值.注释 -- ...

  4. MySQL(四)字段及常用函数

    一.字段 数据库表中的每一行叫做一个“记录”,每一个记录包含这行中的所有信息,但记录在数据库中并没有专门的记录名,常常用它所在的行数表示这是第几个记录. 在数据库中存放在表行列交叉处的数据叫做“值”, ...

  5. (原创)odoo11配置邮件功能的那些事儿

    要点总结: 1.odoo的邮件系统功能设计目的,主要是解决业务相关的邮件沟通问题,切记不要将odoo当作邮件系统或者邮件客户端使用 2.odoo收件,默认需要邮件系统支持catch-all功能,但可惜 ...

  6. Java 面试题 队列

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口.   Q ...

  7. Luogu P1265 公路修建

    一眼看去,就是一道MST的模板题. 然后果断准备跑Kruskal,然后5个TLE. Kruskal复杂度对于这个完全图要O(n^2*logn^2),快排就会导致超时. 然后打了刚学的Prim.朴素O( ...

  8. 案例学Python--案例四:Django实现一个网站的雏形(1)

    第一次用python的Web框架,也是第一次听说Django,参考菜鸡教程和一些博客,倒腾了半天,算是有一个雏形.数据基于昨天爬的豆瓣电影信息,详见案例三. Python版本:3.7.1 Django ...

  9. *C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

    最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...

  10. SpringBoot日记——任务处理 之 异步、定时、邮件

    ---恢复内容开始--- 直接步入正题. 异步任务 异步任务比较简单,只需要两个注解就可以搞定,我们直接来看如何使用: 1.创建一个service,带上@EnableAsync,就是开启异步任务的注解 ...