(底层图解)为什么StringBuilder ,StringBuffer拼接要比字符串拼接更快?

我们首先要知道,在操作系统是上内存是以页为单位分配的。

java中的字符串不能在原地址修改,每次都需要申请新空间,11个字符串共需要申请11个空间 (操作系统要以4kb为单元分配)。实际上消耗11个页单元,44kb。

字符串每次申请空间是用多少申请多少,字符串每拼接一次都要重新申请一个存储单元

字符串拼接会对内存造成极大消耗。而

StringBuilder 一上来就申请足够的空间,而且它的内容可以修改。

比如:char[] arr=new char[4096];

上来申请两个页空间,原char数组是比较大的,所以拼接的时候在页空间加就完事了。

满了之后呢,在其他地方在申请大空间。

因为字符串拼接不可变 每次改变值都需要申请空间,而这个StringBuilder申请的空间,只有满了才要需要申请新空间。它支持原地址修改值,字符串不支持,拼接次数越多二者消耗内存空间差距越大。

有兴趣的可以自行测试一下

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 非常感谢您的提问。我了解到您使用的是CSDN上开发的C知道,并且我是一个类似于ChatGPT的AI模型,我们之间没有直接的联系。 关于您的问题,使用引号将空格括起来是一种常见的字符串表示方法,它可以将一个由多个单词组成的字符串表示为一个整体。在某些情况下,这种表示方法可以方便地处理字符串,但并不是所有情况都适用。在for循环中使用引号括起来的字符串可能会引起语法错误,因为编译器无法识别它们。因此,使用for循环时,通常建议不要使用引号来表示空格。 如果您有其他问题,我很乐意尝试回答它们。请随时向我提问! ### 回答2: 在for循环中使用“+”进行字符串拼接耗费大量的时间和资源。这是因为每次拼接字符串时,都会创建一个新的字符串对象,并且将原始字符串和要拼接的部分复制到新的字符串中。由于字符串是不可变的,每次拼接都需要创建一个新的字符串对象,这将导致频繁的内存分配和复制操作,严重影响性能。 相比之下,使用“+”进行字符串拼接的时间复杂度为O(n^2),其中n是要拼接字符串的长度。在for循环中进行重复的字符串拼接操作时,会导致时间复杂度呈指数级增长,非常低效。 为了避免这种性能问题,推荐使用StringBuilder类或StringBuffer类来进行字符串拼接。这两个类都提供了高效的字符串拼接方法,通过追加字符串的方式来实现拼接,避免了创建新的字符串对象和频繁的复制操作。StringBuilder相比于StringBuffer具有高的性能,但是不是线程安全的。 综上所述,为了提高性能,避免不必要的内存分配和复制操作,不建议在for循环中使用“+”进行字符串拼接,而是应该使用StringBuilderStringBuffer类来进行字符串拼接。 ### 回答3: 在使用 for 循环时,不建议使用“+”进行字符串拼接的主要原因是字符串是不可变的。每次进行字符串拼接时,都会创建一个新的字符串对象,而且字符串对象无法修改,只能重新创建一个包含新内容的字符串对象。 这样的操作会消耗大量的系统资源和时间。当循环次数较多时,每次拼接字符串都会引发一次创建对象的开销,导致性能下降,程序执行时间变长。 相比之下,在大量字符串拼接的情况下,使用“+”运算符拼接字符串效率较低。而使用StringBuilder类或StringBuffer类来进行字符串拼接,会高效。这两个类都是基于可变字符序列的,可以直接在原来的字符串上进行修改和添加,避免了创建多个字符串对象的开销。 因此,在循环中如果需要进行字符串拼接操作,建议使用StringBuilder类或StringBuffer类,先创建一个StringBuilder(或StringBuffer)对象,然后在循环中通过调用其append()方法来添加字符串,最后使用toString()方法转换为String类型输出。 总之,不建议在for循环中使用“+”进行字符串拼接,应该使用StringBuilderStringBuffer类来提高程序性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值