测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

之前一篇里写过字符串常用类的三种方式《java中的字符串相关知识整理》,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简单的测试吧:

public static void main(String[] args) {
        testStringJoin();
    }

    static void testStringJoin() {

        long beg = System.currentTimeMillis();
        String s = null;
        for (int i = 0; i < 100000; i++) {
            s += "ss";
        }

        System.out.println("使用+拼接耗时:" + (System.currentTimeMillis() - beg));

        beg = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 100000; i++) {
            sb.append("ss");
        }
        System.out.println("使用StringBuffer拼接耗时:" + (System.currentTimeMillis() - beg));

        beg = System.currentTimeMillis();
        StringBuilder sbuilder = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sbuilder.append("ss");
        }
        System.out.println("使用StringBuilder拼接耗时:" + (System.currentTimeMillis() - beg));

    }
    

代码非常简单,分别用三种方式拼接字符串10万次,然后计算耗时情况,跑下来还是蛮惊人的:

使用+拼接耗时:9102
使用StringBuffer拼接耗时:3
使用StringBuilder拼接耗时:2

使用+拼接耗时:8956
使用StringBuffer拼接耗时:5
使用StringBuilder拼接耗时:3

两组跑来的数据,大的数据相差不大,而且表现的结果也是一致的。这里可以看到使用+这种常量拼接对性能消耗极大,10万次用时9000ms,而StringBuffer和StringBuilder只用了不到5ms。看来一个简单的字符串拼接还是要重视的,之前没想到会有这么夸张的体现。

至于StringBuffer和StringBuilder来说差别不是特别大,更多的还是考虑线程安全就可以了,也就是说用StringBuffer是种比较保险的方式吧,除非对性能有极高的要求。

时间: 2024-08-02 20:17:23

测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率的相关文章

清空StringBuilder的三种方法及效率

清空StringBuilder的三种方法及效率 大家知道对于字符串频繁拼接是使用stringbuilder.Append方法比使用string+=方法效率高很多,但有时需要清空stringbuilder时却不知道怎么清空,因为它没有clear或empty的方法.那用什么方法呢?在网上搜了一下大概一下三种方法. 1.Remove 例: StringBuilder val = new StringBuilder(); val.Append("...."); val.Remove(0,val

C#三种字符串拼接方法的效率对比

C#字符串拼接的方法常用的有:StringBuilder.+.string.Format.List<string>.使用情况不同,效率不同. 1.+的方式 string sql = "update tableName set int1=" + int1.ToString() + ",int2=" + int2.ToString() + ",int3=" + int3.ToString() + " where id="

javascript测试三种字符串替换方式效率

//第一种  直接正则表达式替换一次 function replaceTrim1(source){ return source.replace(/^\s|\s$/g,""); } //第二种  正则表达式替换两次,先替换前在替换后 function replaceTrim2(source){ return source.replace(/^\s*/,"").replace(/\s*$/,""); } //第三种 正则表达式替换前部分,后部分则是循

java中的StringBuffer和StringBuilder

/* java.lang.StringBuffer; java.lang.StringBuilder; 1.StringBuffer和StringBuilder是什么? 是一个字符串缓冲区. 2.工作原理 预先在内存中申请一块空间,以容纳字符序列, 如果预留的空间不够用,则进行自动扩容,以 容纳更多字符序列. 3.StringBuffer,StringBuilder  和  String最大的区别? String是不可变得字符序列,存储字符串常量池中. StringBuffer底层是一个char

Java中String、StringBuffer、StringBuilder的比较与源 代码分析

Java中String.StringBuffer.StringBuilder的比较与源代码分析 众所周知String.StringBuffer.StringBuilder是java中常用的字符串类,下面我将从三个方面对他们三兄弟进行对比. 一.三者的数据组织及其功能实现 大家爱把String.StringBuffer.StringBuilder叫做三兄弟,经过分析代码发现说他俩三兄弟有点不太贴切,从组织结构上说,StringBuffer.StringBuilder更像是亲兄弟,这哥俩儿都有一个妈

String、StringBuffer和StringBuilder区别及性能分析

1.性能比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常量 StringBuffer:字符串变量 StringBuilder:字符串变量 3.源码分析 String:查看源码得知,String类的声明是:public final,所以很清楚的知道,final的值是改变不了的,所以如果我们用String来操作字符串的时候,一旦字符串的值改变,就会

Java中的String、StringBuffer以及StringBuilder的用法和区别

String String的构造方式有n种(据说n==11),常见的例举一二: // 1 String s1 = "hello world"; // 2 String s2 = new String("hello world"); // 3 char[] a = {'h', 'e', 'l', 'l', 'o'}; String s3 = new String(a, 1, 3); // start length // 4 String s4 = "hell

对字符串进行频繁拼接的话,使用StringBuffer或者StringBuilder

package zhengze; /*如果需要对字符串进行频繁拼接的话,使用StringBuffer或者StringBuilder StringBuffer:[字符串缓冲器]是线程安全的,效率低 StringBuilder:[字符串操作类]是线程不安全的,效率高 */public class StringTest { public static void main(String[] args) { /* * String s1 = "hello"; String s2 = "

Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File

java.lang 类 StringBuffer java.lang.Object java.lang.StringBuffer 所有已实现的接口: Serializable, Appendable, CharSequence public final class StringBufferextends Objectimplements Serializable, CharSequence 线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某