String、StringBuffer、StringBuilder分析-日记篇

一、StringBuffer和String类的一些重要区别:

1、String类是final类,不可被继承。Stringbuffer类也是final类,不可被继承,继承了AbstractStringBuilder类。
在这里插入图片描述

2、StringBuffer构建的字符串的效率较高,因为StringBuffer类存储数据是用父类的char[] 类型的数组,关键是这个数组不是final类型,

在这里插入图片描述

因此是放在堆里的,而不是放到常量池里,因此只有当堆里的容量不够时才会新开辟更大的空间,再将原来的数据拷贝到新空间,然后数据的地址才指向新开的空间(这样子才更新地址);

再看下String类里存储数据的char[]类型:

在这里插入图片描述

这里是final来修饰的,因此这里的数据应该是放到常量池里,然后每次更新String类型的数据(比如str += "str"之类的操作 ),就相当于在常量池里新开辟空间存放新的数据,更新其地址。

因此每次更新存储的数据时,String类型的更新可能更加繁琐,既要开新空间,又要将原来数据和新添加的数据拷贝到新的空间,然后再更新地址。所以效率比StringBuffer慢些。

2、默认StringBuffer的扩容机制:一开始构造器没有参数时是默认可以存16个字符的:

在这里插入图片描述

如果构造器有字符串参数则如下:

在这里插入图片描述

,都是直接看源码即可,没什么吊的东西。

二、StringBuffer类和StringBuilder类的一些重要区别

1、两者的类图:

在这里插入图片描述

在这里插入图片描述

StringBuilder类可以说是StringBuffer类的翻版吧,很多都是类似的。

2、StringBuffer类和StringBuilder类很多操作基本相同的,包括扩容机制、添加数据的方式,

唯一较大的差别是StringBuffer类型数据的很多操作很多是线程安全的,而StringBuilder类型数据是线程不安全

浅浅看一下源码:

在这里插入图片描述

看吧,这里很多方法有synchronized修饰,所以说StringBuffer类型数据在被操作时,加了一层线程安全保护的操作。

而StringBuilder类则没有:

在这里插入图片描述

这么看来,在单线程操作下,StringBuilder类的操作数据的效率应该比StringBuffer高,因为StringBuffer类型数据被加了一次线程控制的保护操作了嘛。

所以说,一般StringBuilder、StringBuffer和String类型数据的操作效率是:

StringBuilder>StringBuffer>String

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值