StringBuffer类深入学习

StringBuffer类深入学习

一,总体介绍

相对于String类,String Buffer最突出的特点就是长度可变,而相对于StringBuilder类,他出色的的就是线程安全特性,Java设计者在文档中这么写道A thread-safe, mutable sequence of characters. A string buffer is like a String,也就是线程安全长度可变 but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls.

StringBuffer 上的主要操作是追加和插入方法,这些方法被重载以便接受任何类型的数据。每个都将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串缓冲区。追加方法始终在缓冲区末尾添加这些字符;插入方法在指定点添加字符。

该类的继承关系如图,直接父类是AbstractStringBuilder

二.构造方法   

1.StringBuffer 构造器默认为初始化16个字符

2.当然也可以通过传入一个String来初始化

三.线程安全

    因为他的大多方法都加了synchronized,防止多个线程同时操作同一个字符串

   

四.长度可变 不产生新对象(以append为例)

1.上面的图片可以看出是调用了super.append(str),也就是说StringBuffer的append功能是继承其父类AbstractStringBuilder的append方法。

2.父类的append方法如下

    当传入的字符串str==null,return appendNull(),这个方法底层也就是也就是什么也不追加,然后返回。

在AbstractStringBuilder中append方法的实现,是确定容器"capacity"的大小,便于下面value的重新赋值,所以这一步可以看作类似“踩点”的行为,实现追加的是调用了getChars()方法,下面是getChar方法体

可以看出,在上面的多个if语句判断没问题,可以追加了之后,就会最终调用系统类的arrayCopy()方法,这才是真正实现追加的最终力量。具体他是怎么实现的,网上有如下图解

所以StringBuffer为什么是可变类。因为StringBuffer的append方法的底层实现就是创建一个新的目标对象,然后将各个字符的引用串接起来,这就是一个新的对象了,值得注意的是把引用串接起来了,本质上就是栈多了一个变量,而堆上面并没有变化(为什么是在栈上呢?因为用到的arraycopy方法是native修饰的,也就是其生成的变量会放到本地方法栈上面去)。

那为什么我们没有把StringBuffer划分为不可变类呢?它明明在栈中创建了一个新的对象。因为一般的对象和数组都会在堆中进行存储,除非是发生了栈上分配现象。相比较String对象的存储,就可以知道,StringBuffer对象在此处并不符合栈上分配的条件( 将线程私有的对象打散分配在栈上,可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响,栈上分配速度快,提高系统性能),所以,StringBuffer的append方法并不会在堆上创建新的StringBuffer对象,且内容是结果字符串,而是在arraycopy方法的帮助下,将各个字符引用连接起来。

结论:StringBuffer是一个可变类。任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.别止步春天.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值