java中String StringBuilder StringBuffer比较和效率(性能)测试 (4)

以上代码运行结果为:

在这里插入图片描述


可以看到,String创建了大量无用对象,消耗了大量内存耗时上大概是StringBuffer 和 builder的100倍。

当然,我们只循环了10000次,StringBuilder的优势不是很明显,为了防止java 虚拟机 jvm 垃圾回收机制的干扰 我们我StringBuilder 和 StringBuffer 单独拿出来吧循环次数加到10万次、100万次和1000万次测试:
代码吧String部分注释掉,由于循环次数较多,jvm 在运行时会有垃圾回收,内存对比会不正确,也先注释:

package com.xzlf.string; public class TestString { public static void main(String[] args) { // 使用 String 进行字符拼接 // String str = ""; // long num1 = Runtime.getRuntime().freeMemory();// 获取系统剩余内存空间 // long time1 = System.currentTimeMillis(); // for (int i = 0; i < 10000; i++) { // str += i; // 相当于产生了5000个对象 // } // long num2 = Runtime.getRuntime().freeMemory(); // long time2 = System.currentTimeMillis(); // System.out.println("String 占用了内存:" + (num1 - num2)); // System.out.println("String 占用了时间:" + (time2 - time1)); // 使用 StringBuilder 进行字符串拼接 StringBuilder sb = new StringBuilder(""); long num3 = Runtime.getRuntime().freeMemory(); long time3 = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { sb.append(i); } long num4 = Runtime.getRuntime().freeMemory(); long time4 = System.currentTimeMillis(); // System.out.println("StringBuilder 占用了内存:" + (num3 - num4)); System.out.println("StringBuilder 占用了时间:" + (time4 - time3)); // 使用 StringBuilder 进行字符串拼接 StringBuffer sb2 = new StringBuffer(""); long num5 = Runtime.getRuntime().freeMemory(); long time5 = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { sb2.append(i); } long num6 = Runtime.getRuntime().freeMemory(); long time6 = System.currentTimeMillis(); // System.out.println("StringBuffer 占用了内存:" + (num5 - num6)); System.out.println("StringBuffer 占用了时间:" + (time6 - time5)); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxppw.html