StringBuilder源码分析
一.概述
StringBuilder是java中用来处理字符串的类。不同于String,StringBuilder保存的字符串可以进行修改,拼接,删除等操作。StringBuilder是线程不安全的。
StringBuilder.java中的相关代码:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
…
}
1.StringBuilder被final修饰,不能被继承。
2.继承了AbstractStringBuilder,StringBuilder中的方法基本都是通过AbstractStringBuilder实现。
3.实现了java.io.Serializable接口,可以进行序列化。
4. 实现了CharSequence接口,可以将字符串当成一个一个的字符处理。
二.源码分析
1.全局变量
StringBuilder.java中的相关代码:
static final long serialVersionUID = 4383685877147921099L;
StringBuilder中只有一个全局变量serialVersionUID,用于序列化。
2.常用的构造方法
1)无参数
StringBuilder.java中的相关代码:
public StringBuilder() {
super(16);
}
默认情况下,调用构造方法,会调用父类的构造方法,分配一个容量为16个字符空间。
2)参数为int
StringBuilder.java中的相关代码:
public StringBuilder(int capacity) {
super(capacity);
}
调用父类方法,指定需要分配的空间的大小来进行分配。
3)参数为String
StringBuilder.java中的相关代码:
public StringBuilder(String str) {
// 分配空间
super(str.length() + 16);
// 保存字符串
append(str);
}
调用父类的方法,为字符串分配空间,同时再多分配出来16个字符大小的空间,防止之后字符串长度发生改变;保存字符串。
3.append方法
在当前字符串后拼接一个字符串。
StringBuilder.java中的相关代码:
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
调用了参数为String的重载方法。
StringBuilder.java中的相关代码:
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
调用父类的方法append方法,返回。
其它参数类型的append方法,也都是通过调用父类的append方法实现。
4.delete方法
删除指定长度的字符串。
StringBuilder.java中的相关代码:
@Override
public StringBuilder delete(int start, int end) {
super.delete(start, end);
return this;
}
调用父类的delete方法,返回。
5.replace方法
将原字符串中start和end之间的字符替换为str。
StringBuilder.java中的相关代码:
@Override
public StringBuilder replace(int start, int end, String str) {
super.replace(start, end, str);
return this;
}
调用父类的replace方法,返回。
6. insert方法
在原字符串offset位置插入字符串str。
StringBuilder.java中的相关代码:
@Override
public StringBuilder insert(int offset, String str) {
super.insert(offset, str);
return this;
}
调用父类的insert方法,返回。
其它参数形式的insert方法,也都是通过调用父类的insert方法实现。
7.indexOf方法
返回源字符串中str字符串首次出现的位置。
StringBuilder.java中的相关代码:
@Override
public int indexOf(String str) {
return super.indexOf(str);
}
调用并返回父类的indexOf方法。
其它参数形式的indexOf方法,也都是通过调用父类的indexOf方法实现。
8.reverse方法
将字符串进行反转。
StringBuilder.java中的相关代码:
@Override
public StringBuilder reverse() {
super.reverse();
return this;
}
调用父类的reverse方法,返回。
9.toString方法
将StringBuilder对象转换为String对象。
StringBuilder.java中的相关代码:
@Override
public String toString() {
return new String(value, 0, count);
}
创建并返回新的String对象。
10.writeObject方法
对StringBuilder对象进行序列化。
StringBuilder.java中的相关代码:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
s.defaultWriteObject();
// 保存当前已经使用的空间大小
s.writeInt(count);
// 保存当前的字符数组
s.writeObject(value);
}
11.readObject方法
对StringBuilder对象进行反序列化。
StringBuilder.java中的相关代码:
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
// 获取已经使用的空间大小
count = s.readInt();
// 获取保存的字符数组
value = (char[]) s.readObject();
}