小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
StringBuilder 是比 String 更常用的一个类。
要是论资排辈,StringBuilder 要靠后一些,直到 JDK1.5 才提供。要知道,另一个常用的字符串类:StringBuffer 在 JDK1.0 就有了。
那么,为什么这个比 String 长怎么多的单词是最常用的呢?
原因如下:
StringBuilder能够实现 可变的字符序列;- 在
.append()的时候,比String的+=节约了大量的空间和时间资源; - 不考虑线程安全,比
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);
}
}
}
这是运行结果:
- 占用内存:一个是 22624024,另一个是 0;
- 占用时间:一个是 99,另一个是 1。
简直一个天上一个地下有木有哇。
⭐️ 小结
这节课是高淇老师要求手敲的,非常重要!!!
除了要记住 String 可能会创建大量无用的内存对象,造成内存泄露以外,还要学会如何用Runtime.getRuntime().freeMemory() 和 System.currentTimeMillis() 进行简单的性能测试。
如果您有更实战的分析经验,还请多多指教~ ❤