为什么String和StringBuilder相比,String这么慢?

本文深入探讨了String与StringBuilder在存储方式及运算过程中的区别,分析了两者在内存分配、资源消耗上的不同,强调了在大量字符串拼接操作中使用StringBuilder的效率优势。

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

存储的时的区别.

先来看看各自都是如何存储的

String

在这里插入图片描述

StringBuilder

StringBuffer继承自AbstractStringBuilder,自身没有定义存储的容器,而是继承了其父类的容器在这里插入图片描述

这个就是StringBuilder存储字符的地方

从上面看出,String的字符是存储在一个被final修饰的char数组(类似于c中的指针常量)中的,而StringBuilder的字符是存储在一个普通的char数组中的


运算时的区别

String的运算

在这里插入图片描述

这两个相加的操作可以看作这样

final char c1[] = {'第','一','个','字','符','串'};

final char c2[] = {'第','二','个','字','符','串'};

final char c3[] = new char[12];

c3[] =  {'第','一','个','字','符','串','第','二','个','字','符','串'};

c1 = c3

//这段只做理解

String在运算的时候都会创建一个大小合适的char数组[],所以当下次再拼接的时候都要进行重新分配.

StringBuilder的运算

在这里插入图片描述
在这里插入图片描述
StringBuilder特征

  • StringBuilder初始化容量是16(无参构造)
  • 追加之前会计算一次容量,大于所需容量则会重新创建一个char[]数组,计算规则是 newCapacity = (value.length << 1) + 2; 也就是 原来长度*2+2
  • StringBuilder在运算的时候每次会计算容量是否足够,如果所需容量不小于自身容量,那么就会重新分配一个自身容量两倍+2的char[].所以省去了很多创建char[]的次数.

大白话结论

  • String之所以慢是因为,大部分cpu资源都被浪费在分配资源,拷贝资源的部分了,相比StringBuilder有更多的内存消耗.
  • StringBuilder快就快在,相比String,他在运算的时候分配内存次数小,所以拷贝次数和内存占用也随之减少.
  • 由于GC的机制,即便原来的char[]没有引用了,那么也得等到GC触发的时候才能回收,String运算过多的时候就会产生大量垃圾,消耗内存.

建议

  • 如果目标字符串需要大量拼接的操作,那么这个时候应当使用StringBuilder.
  • 反之,如果目标字符串操作次数极少,或者是常量,那么就直接使用String.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值