java基礎類庫學習(一.2)String/StringBuffer/StringBuilder
阿新 • • 發佈:2018-12-17
String/StringBuffer/StringBuilder類是對字串的抽象?
String類是一個不可變類,例項建立後不可改變
StringBuffer是一個可變類,實力建立後允許改變,是執行緒安全的,效能略低
可以將StringBuffer的例項轉換成Sting的例項
StringBuilder是一個可變類,實力建立後允許改變,不是執行緒安全的,效能略高
String/StringBuffer/StringBuilder都實現了CharSequence介面
CharSequence介面原始碼?
public interface CharSequence {
int length();
char charAt(int index);
public String toString();
}
String類原始碼?
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];//決定String是一個不可變類
private static final long serialVersionUID = -6849794470754667710L;
private int hash; // Default to 0
public String() {//構造方法 this.value = "".value; }
public String(String original) {//構造方法 this.value = original.value; this.hash = original.hash; }
public String(char value[]) {//構造方法 this.value = Arrays.copyOf(value, value.length); }
public String(StringBuffer buffer) {//構造方法 synchronized(buffer) { this.value = Arrays.copyOf(buffer.getValue(), buffer.length()); } }
public String(StringBuilder builder) {//構造方法 this.value = Arrays.copyOf(builder.getValue(), builder.length()); }
public int length() { return value.length; }
public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; }
public boolean equals(Object anObject) {//重寫父類Object方法 if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
public int hashCode() {//重寫父類Object方法 int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
}
因為String類是不可變的,因此會額外產生許多臨時的String例項,因此使用StringBuffer/StringBuilder來代替
這些提供了許多改變字元序列的方法
append()/reverse()/insert()/delete()/replace()
StringBuffer原始碼?執行緒安全
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
private transient char[] toStringCache;
static final long serialVersionUID = 3388685877147921107L;
public StringBuffer() { super(16); }
public StringBuffer(int capacity) { super(capacity); }
public StringBuffer(String str) { super(str.length() + 16); append(str); }
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}
public synchronized StringBuffer delete(int start, int end) { toStringCache = null; super.delete(start, end); return this; }
public synchronized StringBuffer insert(int index, char[] str, int offset,
int len)
{
toStringCache = null;
super.insert(index, str, offset, len);
return this;
}
public synchronized StringBuffer reverse() {
toStringCache = null;
super.reverse();
return this;
}
}
StringBuilder原始碼?執行緒不安全
ublic final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {
static final long serialVersionUID = 4383685877147921099L;
public StringBuilder() { super(16); }
public StringBuilder(String str) { super(str.length() + 16); append(str); }
public StringBuilder append(char c) { super.append(c); return this; }
public StringBuilder insert(int index, char[] str, int offset, int len) { super.insert(index, str, offset, len); return this; }
public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }
}