在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来拼接 .