源码解析StringBuffer-基于JDK-15
导读
通过本文的阅读,可以了解StringBuffer类的构造,如何初始化以及内部的一些方法。了解为什么相对于String类,StringBuffer类可以更好的处理字符串。StringBuffer类的内部方法基本都是synchronized修饰的,说明是线程同步的,增加了线程的安全。
StringBuffer的源码分析
首先看下StringBuffer类的定义
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
...
}
StringBuffer类被final修饰,表明不可被继承,StringBuffer继承了AbstractStringBuilder类,实现了Serializable和CharSequence两个接口。
实现了Serializable接口表明可以序列化
实现了CharSequence接口,可以实现一些字符序列的操作,CharSequence接口有如下的一些方法:
int length();//获取字符串的长度
char charAt(int index);//获取选定索引对应的字符
CharSequence subSequence(int start, int end);//获取指定范围的字符串
public String toString();//转换成字符串对象
public default IntStream chars(){//源码中有默认的实现,主要是用来获取字符的int类型值的流
...
}
public default IntStream codePoints(){//默认实现,获取字符代码点的int类型值的流
...
}
public static int compare(CharSequence cs1, CharSequence cs2) {
...
}//默认实现,按照字典的顺序比较两个序列,如果第一个序列在字典上小于,等于或大于第二个序列,则分别返回负值,零或正值。
StringBuffer类的一些属性
private transient String toStringCache;
byte[] value;
byte coder;
int count;
- toStringCache属性,主要是缓存toString()的返回值,避免重复的创建toString()对象。
- value属性,主要是用来存储字符
- coder属性,表示对字符串编码的编码器的ID
- count属性,计数使用过的字符数
StringBuffer类的构造方法
public StringBuffer() {
super(16);
}
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer(String str) {
super(str);
}
public StringBuffer(CharSequence seq){
super(seq);
}
- 其中没有参数的构造函数,是默认构造一个16长度的byte数组
- 参数是int类型的构造函数,是构造指定容量长度的byte数组
- 参数是String类型和CharSequence类型的构造函数,是构造(16+参数长度)的byte数组,增加长度的实现在继承的AbstractStringBuilder的构造函数中实现的。
再看下一些主要的方法
方法很多,下面是部分的截图
主要是一些增删改查,一些字符序列的操作。这个图片是用NetBeans查看JDK源码截的图,如果有需要可以查询具体的函数方法,函数都有解释说明,可以参考给出的解释一起看。
对其中的部分实现截图
大部分方法都是synchronized修饰的,说明线程是同步的,增加了线程的安全性
总结
通过对StringBuffer类得我源码进行分析,得出在看源码的时候主要从以下的几个方面进行分析。首先,分析类的定义,了解这个类是干什么的;其次,分析类的属性和构造方法,明白如何初始化;最后,再根据需要查看内部的一些方法。