一、背景

  在使用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占位符的更多相关文章

  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. PHP常见面试题汇总(二)

    PHP常见面试题汇总(二)   //第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数 $array=array(4,5,1,2,3,1, ...

  2. 编译安装nginx,并使用systemd管理nginx

    #tar zxvf nginx-1.8.1.tar.gz #cd nginx-1.8.1/ #make && make install #cat /etc/systemd/system ...

  3. 多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();

    在多线程中所有的操作方法都是从Thread类开始的,所有的操作基本都在Thread类中. 第一取得线程名字 a,在Thread类中,可以通过getName()方法,获得线程的名字,可以通过setNam ...

  4. 最小生成树(图论)--3366lg【模版】

    题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...

  5. PAT A1110 Complete Binary Tree (25 分)——完全二叉树,字符串转数字

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  6. PAT A1033 To Fill or Not to Fill (25 分)——贪心

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank c ...

  7. 用Qt程序打开.txt 文件的时候,出现乱码的情况

    打开*.txt 文件出现乱码的情况,说明编码格式不对,一般的Windows下创建的txt 文件,到ubuntu 系统中打开会出现乱码的情况, 下面的代码读取文件,并且转化编码格式 void MainW ...

  8. jmeter(十二)关联之正则表达式提取器

    如果有这样的情况:一个完整的操作流程,需要先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就是常说的关联/将上一个请求的响应结果作为下一个请求的参数): 在jmeter中,可以利用正 ...

  9. TCP/IP协议---UDP协议

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报.UDP数据报是要依赖IP数据报传送的.UDP协议并不可靠,它不能保证发出去的包会被目 ...

  10. Codeforces Hello 2019

    Hello 2019 手速场qwq 反正EGH太神仙了啊.jpg 考试的时候不会啊.jpg A 暴力.jpg #include <cstdio> #include <algorith ...