ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

String vs StringBuffer vs StringBuilder

2021-07-13 12:30:29  阅读:198  来源: 互联网

标签:cost String StringBuffer vs StringBuilder stopWatch new public


代码实现

String 类是一个final类型的不可变类,所以在对String类进行操作时,都会创建一个新的String类,造成空间和时间的开销。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    }

StringBuilder类 和StringBuffer类均实现了相同的接口和继承了相同的父类,只是StringBuffer的方法上加了synchronized关键字,保证在多线程情况下是线程安全的,其它实现没有差别。

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuilder>, CharSequence
{
    @Override
    @HotSpotIntrinsicCandidate
    public StringBuilder append(int i) {
        super.append(i);
        return this;
    }
}

StringBuffer类

 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
    @Override
    @HotSpotIntrinsicCandidate
    public synchronized StringBuffer append(int i) {
        toStringCache = null;
        super.append(i);
        return this;
    }
}

性能对比

通过写代码对比,String的性能比StringBuffer和StringBuiler慢5-10个数量级;
在单线程情况下,StringBuffer的性能反而比StringBuilder快,具体原因有待分析;
在多线程情况下,StringBuilder性能比StringBuffer性能快,因为StringBuffer需要获取对象锁;

测试结果为:

StringBuilder cost:14
MultiStringBuffer cost:102
MultiStringBuilder cost:61
StringBuffer cost:9
String cost:940
@TestInstance(Lifecycle.PER_CLASS)
public class GenericTest {

    @Test
    public void testString() {

        AtomicReference<String> s = new AtomicReference<>("");
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        IntStream.range(0, 100000).forEach(i -> {
            s.set(s + "i");
        });
        stopWatch.stop();
        System.out.println("String cost:" + stopWatch.getTotalTimeMillis());
    }

    @Test
    public void testStringBuilder() {
        StringBuilder s = new StringBuilder();
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        IntStream.range(0, 100000).forEach(i -> {
            s.append(i);
        });
        stopWatch.stop();
        System.out.println("StringBuilder cost:" + stopWatch.getTotalTimeMillis());
    }

    @Test
    public void testStringBuffer() {

        StringBuffer s = new StringBuffer();
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        IntStream.range(0, 100000).forEach(i -> {
            s.append(i);
        });
        stopWatch.stop();
        System.out.println("StringBuffer cost:" + stopWatch.getTotalTimeMillis());
    }

    @Test
    public void testMultiStringBuilder() throws InterruptedException {
        StringBuilder s = new StringBuilder();
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Thread t1 = new Thread(() -> {
            IntStream.range(0, 100000).forEach(i -> {
                s.append(i);
            });
        });
        Thread t2 = new Thread(() -> {
            IntStream.range(0, 100000).forEach(i -> {
                s.append(i);
            });
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        stopWatch.stop();
        System.out.println("MultiStringBuilder cost:" + stopWatch.getTotalTimeMillis());
    }

    @Test
    public void testMultiStringBuffer() throws InterruptedException {

        StringBuffer s = new StringBuffer();
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        Thread t1 = new Thread(() -> {
            IntStream.range(0, 100000).forEach(i -> {
                s.append(i);
            });
        });
        Thread t2 = new Thread(() -> {
            IntStream.range(0, 100000).forEach(i -> {
                s.append(i);
            });
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        stopWatch.stop();
        System.out.println("MultiStringBuffer cost:" + stopWatch.getTotalTimeMillis());
    }

}

应用场景

对于少量的字符串拼接,可以采用String;
对于单线程下大量字符串操作,用StringBuffer和StringBuilder均可;
对于多线程下的大量字符串操作,采用StringBuffer;

标签:cost,String,StringBuffer,vs,StringBuilder,stopWatch,new,public
来源: https://blog.csdn.net/tyut_aa/article/details/118697266

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有