StringBuffer与StringBuilder浅析

本文对比分析了StringBuffer与StringBuilder的使用场景与性能差异,并深入探讨了它们的底层实现原理,帮助开发者理解何时选用何种工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 为什么要用StringBuffer和StringBuilder?

 

String c = "aaa" +"bbb"与sb.append("aaa").append("bbb")有什么区别,类似这样的问题大家应该都很熟悉,它经常出现在面试题,我想答案大家都已经很清楚,用+会创建多个String,因为String是存放在常量池中的,而且是不可以变的,"aaa"变不成"aaabbb"。反过来问一下,都思考过StringBuffer或者StringBuilder到底怎么实现的?StringBuffer底层数据结构又是怎样的呢?带着这一番问题查看了StringBuffer的源码?

     StringBuffer和StringBuilder都是继承于AbstractStringBuilder,底层的逻辑都包含在这个类中。C中是没有字符串用char[]数组来实现字符串。StringBuffer底层也是char[],数组初始化的时候就定下了大小,如果不断的append肯定有超过数组大小的时候,我们是不是定义一个超大容量的数组,太浪费空间了。就像ArrayList的实现,采用动态扩展,每次append首先检查容量,容量不够就先扩展,然后复制原数组的内容到扩展以后的数组中,就这么简单,别无其他。

 public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);//查看使用空间满足,不满足扩展空间
        str.getChars(0, len, value, count);//getChars就是利用native的array copy,性能高效
        count += len;
        return this;
    }

 

2. StringBuffer和StringBuilder区别?

StringBuffer的操作加上synchronized,而StringBuilder没有高效,如果我们在方法中声明并使用,就是局部变量,不会逃逸出这个方法体使用StringBuilder高效高一些。StringBuffer更适合并发访问的场景

3.如何高效的使用StringBuffer和StringBuilder?

如大概知道String的大小,尽量使用public StringBuffer(int capacity)指定容量,避免更少的动态扩展

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值