java基础类库学习(一.2)String/StringBuffer/StringBuilder

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/83447073

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

}

猜你喜欢

转载自blog.csdn.net/strivenoend/article/details/83447073