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();
}