在Java中 , 对字符串内容的拼接是比较常见的操作 , 通常有三种方式 .
可以看到StringBuilder.append的执行时间和内存占用都是最优的 . '+' 运算符比直接调用StringBuilder.append要慢上不少 , 特别是要连接的字符串数量较多时 , 内存占用也特别大 . String.format由于每次都有生成一个Formatter对象 , 从时间和内存占用上都最差 .
但在实际的业务场景中 , 我们为了程序的可读性 , 简洁等因素 . 往往直接使用'+'拼接 . 而在需要数据转换的时候 , 如日期转换 , 数字转换等 , 可以直接用String.format来拼接 .
- 用String类重载'+'运算符进行拼接本质上是调用StringBuilder.append .
- 用类似C的printf风格 , 调用String.format() . 底层是调用formatter.format方法 .
- 用原生的StringBuilder.append方法 .
那从性能和内存占用两个方面考虑到底是哪一个方法更好呢?
package com.xbz.demo; public class StringAppend { private static final int frequency = 10000; private static Runtime runtime = Runtime.getRuntime(); private static long memory;//初始可用内存 private static long beginTime;//开始时间 /* 模拟变量 */ private static String productName = "iPhone XXL";//产品名称 private static Double productPrice = 9899.0;//产品价格 private static String productAddress = "中国";//产品生产地 public static void main(String[] args) { beginTime = System.currentTimeMillis(); memory = runtime.freeMemory(); stringAppend1(); printInfoAndClear(); stringAppend2(); printInfoAndClear(); stringAppend3(); printInfoAndClear(); } /** 字符串拼接 , +号直接拼接 */ private static void stringAppend1() { for (int i = 0; i < frequency; i++) { String result = "产品名称 : " + productName + " , 价格 : " + productPrice + " , 生产地 : " + productAddress; } } /** 字符串拼接 , String.format格式化方式 */ private static void stringAppend2() { for (int i = 0; i < frequency; i++) { String result = String.format("产品名称 : %s , 价格 : %s , 生产地 : %s", productName, productPrice, productAddress); } } /** 字符串拼接 , StringBuilder.append方式 */ private static void stringAppend3() { for (int i = 0; i < frequency; i++) { StringBuilder sb = new StringBuilder(); sb.append("产品名称 : ").append(productName).append(" , 价格 : ").append(productPrice).append(" , 生产地 : ").append(productAddress); String result = sb.toString(); } } /** 输出时间和内存信息 , 并初始化变量 */ private static void printInfoAndClear() { System.out.println("耗时 : " + (System.currentTimeMillis() - beginTime) + " , 内存 : " + (memory - runtime.freeMemory()) / 10000 + "W"); beginTime = System.currentTimeMillis(); memory = runtime.freeMemory(); } }
对比结果如下 :
Method | Time (ms) | Memory Usage (long / 10000) |
+ | 9 | 671 |
String.format | 60 | 1879 |
StringBuilder.append | 4 | 536 |
但在实际的业务场景中 , 我们为了程序的可读性 , 简洁等因素 . 往往直接使用'+'拼接 . 而在需要数据转换的时候 , 如日期转换 , 数字转换等 , 可以直接用String.format来拼接 .