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

​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);
}
}
}

这是运行结果:

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

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

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

⭐️ 小结

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

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