每日一题:String、StringBuffer、StringBuilder的区别

String类

  • String不是基本数据类型,底层数据结构是 final修饰的char数组
  • String是不可变字符串,一旦定义,无法再修改,每次赋值都是一个新的String对象;
  • String拼接(+操作):原理是在堆上new了一个与原字符串相同的StringBuilder对象,然后再调用append方法拼接 +后面的字符串;
  • 使用场景:少量字符串操作

 

StringBuilder类

  • 数据结构:char数组
  • 可变字符串
  • 非线程安全
  • 默认容量16,扩容时仍会重新申请内存空间
  • 使用场景:单线程下在字符缓冲区进行大量操作的情况

线程不安全的原因: append方法使用了父类AbstractStringBuilder.append()的实现

AAAAAElFTkSuQmCC

1LTYmX4SCDnU3q6MpMREgAkSACBABIkAEWoOAVcimyLUHukqkqLxWgurbdMxRawwUKpMIEAEiQASIABEgAk0hYBWy2ZSG0TVEgAgQASJABIgAESACrU+AZLP1+4BqQASIABEgAkSACBCBdkuAZLPddi01jAgQASJABIgAESACrU+AZLP1+4BqQASIABEgAkSACBCBdkuAZLPddi01jAgQASJABIgAESACrU9AJZu2tratXxOqAREgAkSACBABIkAEiEC7I0Cy2e66lBpEBIgAESACRIAIEIG2Q0Alm5999hkWL17cdmpFNSECRIAIEAEiQASIABFoFwRINttFN1IjiAARIAJEgAgQASLQNgmQbLbNfqFaEQEiQASIABEgAkSgXRD4f2nsxLv1k6RSAAAAAElFTkSuQmCC

count += len; 是非原子操作,在多线程环境下,会出现线程安全问题;

 

StringBuffer类

  • 数据结构:char数组
  • 可变字符串
  • 线程安全,大多数方法使用synchronized进行修饰

A03KkKMdogSBAAAAAElFTkSuQmCC

  • 默认容量16,扩容时仍会重新申请内存空间
  • 使用场景:多线程下大量操作字符串的情况

 

相同点:

  • 都用于字符串操作场景(字符串数组)
  • 都是final类(不可继承)

 

不同点:

  • String长度不可变,线程不安全
  • StringBuilder长度可变,线程不安全
  • StringBuffer长度可变,线程安全
  • String重写equal方法,比较的是字符串的内容;StringBuilder和StringBuffer比较的是对象地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

院长Amos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值