Java8中字符串拼接效率问题
- 问题来源
- 测试方法与测试用例
- JMH测试结果分析
- 完整测试程序
一:问题来源
在某开源框架中自定义了StringUtils类,其中的getUUID很惹人注目:
public static String getUUID(){
String s = UUID.randomUUID().toString();
return s.substring(0,8) + s.substring(9,13) + s.substring(14,18) + s.substring(19,23) + s.substring(24);
}
1> 字符串+号
拼接效率在我印象中效率是很低的,为什么不用StringBuffer/StringBuilder呢?
2> UUID标准格式为8-4-4-4-12
,一般替换-
取剩下的连续32位字符串使用,使用replaceAll不是更加简洁吗?效率难道还没有拼接效率高?
3> 字符串+号
拼接效率和cancat、StringBuffer效率差别真的那么明显吗?
4> 问题出来了,该怎么解决呢?当前问题产生于Java8环境下
二:测试方法与测试用例
1> 测试方法
- 可以使用
System.currentTimeMillis()
捕获测试用例起止时间,手动比较; - JMH测试框架也是个不错的选择(
√
), 分析结果可以使用工具直接生成直方图
。
2> 测试用例
@Benchmark
public void testStringAdd(Blackhole blackhole) {
String a = "";
for (int i = 0; i < length; i++) {
String s = UUID.randomUUID().