Java中三种字符串的拼接(++ , String.format , StringBuilder.append)

    在Java中 , 对字符串内容的拼接是比较常见的操作 , 通常有三种方式 . 
  1. 用String类重载'+'运算符进行拼接本质上是调用StringBuilder.append . 
  2. 用类似C的printf风格 , 调用String.format() . 底层是调用formatter.format方法 . 
  3. 用原生的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
    可以看到StringBuilder.append的执行时间和内存占用都是最优的 . '+' 运算符比直接调用StringBuilder.append要慢上不少 , 特别是要连接的字符串数量较多时 , 内存占用也特别大 . String.format由于每次都有生成一个Formatter对象 , 从时间和内存占用上都最差 . 
    但在实际的业务场景中 , 我们为了程序的可读性 , 简洁等因素 . 往往直接使用'+'拼接 . 而在需要数据转换的时候 , 如日期转换 , 数字转换等 , 可以直接用String.format来拼接 . 

猜你喜欢

转载自blog.csdn.net/xingbaozhen1210/article/details/80061523