不比不知道,一比吓一跳——String 和 StringBuilder 效率对比

491 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

StringBuilder 是比 String 更常用的一个类。 要是论资排辈,StringBuilder 要靠后一些,直到 JDK1.5 才提供。要知道,另一个常用的字符串类:StringBuffer 在 JDK1.0 就有了。

那么,为什么这个比 String 长怎么多的单词是最常用的呢?

原因如下:

  1. StringBuilder 能够实现 可变的字符序列
  2. .append() 的时候,比 String+= 节约了大量的空间和时间资源;
  3. 不考虑线程安全,比 StringBuffer 效率更高

⭐️ Talk less,show u the code


/**
 *  测试 String 和 StringBuilder 的性能差别
 */

public class StringTrip {
    public static void main(String[] args) {

        String strString  = "";
        // 记录一个初始值
        long num_start = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间
        long time_start = System.currentTimeMillis(); // 获取系统的当前时间
        stringAdd(strString);             // 用 String 来添加
        long num_end = Runtime.getRuntime().freeMemory();
        long time_end = System.currentTimeMillis();
        // 用一开始的可用内存空间 - 添加字符后的可用内存空间 = 占用的内存大小
        // 然后用跑完程序的时间戳 - 开始的时间戳 = 中间添加字符消耗的时间
        System.out.println("String 占用内存: "+ (num_start-num_end));
        System.out.println("String 占用时间: "+ (time_end-time_start));

        StringBuilder strBuilder = new StringBuilder();
        long num_start1 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间
        long time_start1 = System.currentTimeMillis(); // 获取系统的当前时间
        stringBuilderAdd(strBuilder);    // 用 StringBuilder 来添加
        long num_end1 = Runtime.getRuntime().freeMemory();
        long time_end1 = System.currentTimeMillis();
        System.out.println("StringBuilder 占用内存: "+ (num_start1-num_end1));
        System.out.println("StringBuilder 占用时间: "+ (time_end1-time_start1));
    }

    static void stringAdd(String s) {  // 用 String 来添加

        for (int i=0; i< 5000; i++) {
            s = s + i; // 相当于产生了 5000个对象
        }
    }

    static void stringBuilderAdd(StringBuilder s) { // 用 StringBuilder 来添加
        for (int i = 0; i< 5000; i++) {
            s.append(i);
        }
    }
}

这是运行结果:

image.png

  • 占用内存:一个是 22624024,另一个是 0;
  • 占用时间:一个是 99,另一个是 1。

简直一个天上一个地下有木有哇。

⭐️ 小结

这节课是高淇老师要求手敲的,非常重要!!!

除了要记住 String 可能会创建大量无用的内存对象,造成内存泄露以外,还要学会如何用Runtime.getRuntime().freeMemory()System.currentTimeMillis() 进行简单的性能测试。

如果您有更实战的分析经验,还请多多指教~ ❤