1. 程式人生 > >java基礎類庫學習(一.2)String/StringBuffer/StringBuilder

java基礎類庫學習(一.2)String/StringBuffer/StringBuilder

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

}