关于String、StringBuffer、StringBuilder的区别

概述

在日常撸码中,经常会有字符串的合并,如果数据小还好,如果数据大的话,就会涉及到一个效率的问题。我们经常使用String,但是,实际上还有StringBuffer、StringBuilder。我们来验证一下它们的效率。累加字符串10000次,比较它们所用的时间。

String

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3;
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            str1 = str1 + "123123123";
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

运行时间为:time:359

StringBuffer

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3;
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            str2.append("123123123");
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

运行时间为:time:0

我们把次数加大到100000次

运行时间为:time:16

StringBuilder

同样我们把次数加大到100000次

public static void main(String[] args) {
        String str1 = "";
        StringBuffer str2 = new StringBuffer();
        StringBuilder str3 = new StringBuilder();
        long lasttime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            str3.append("123123123");
        }
        long currenttime = System.currentTimeMillis();
        System.out.println("time:"+(currenttime-lasttime));
    }

运行时间为:time:0

我们再次把次数加大到100000次

运行时间为:time:31

总结

由上面的数据可以看出,拼接字符串的效率是:

String < StringBuffer < StringBuilder

在API文档中,StringBuffer的介绍是:

线程安全的可变字符序列。

StringBuilder的介绍是:

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。

猜你喜欢

转载自blog.csdn.net/full_stack_developer/article/details/80854707