java String StringBuilder StringBuffer

开篇

 看了源码之后会发现有关java的String知识点面试的确很无聊,但凡看过代码的基本上都知道,所以我们去面试别人就用这个去面试别人就是为了验证别人有没有看过源码?


String源码分析

  • String通过char value[]的字符数组来保存数据。
public final class String
    implements java.io.Serializable, Comparable, CharSequence {

    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    private static final long serialVersionUID = -6849794470754667710L;

    private static final ObjectStreamField[] serialPersistentFields =
        new ObjectStreamField[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);
    }
}


StringBuilder源码分析

  • StringBuilder继承自AbstractStringBuilder类,数组存储对象在基类中实现
  • StringBuilder的方法没有加锁操作,非线程安全
public final class StringBuilder extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    /** use serialVersionUID for interoperability */
    static final long serialVersionUID = 4383685877147921099L;

    public StringBuilder() {
        super(16);
    }

    public StringBuilder(int capacity) {
        super(capacity);
    }

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }

    public StringBuilder(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
}


StringBuffer源码分析

  • StringBuffer继承自AbstractStringBuilder类,数组存储对象在基类中实现
  • StringBuffer的方法有加锁操作,线程安全
  • StringBuffer内部通过toStringCache变量提高toString()性能
 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    private transient char[] toStringCache;

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    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 StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }

    @Override
    public synchronized int length() {
        return count;
    }

    @Override
    public synchronized int capacity() {
        return value.length;
    }

    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
}


共同基类AbstractStringBuilder

  • AbstractStringBuilder作为StringBuilder和StringBuffer的基类
  • AbstractStringBuilder通过char[] value保存字符串
  • AbstractStringBuilder内部包含count字段进行计数
abstract class AbstractStringBuilder implements Appendable, CharSequence {

    char[] value;
    int count;

    AbstractStringBuilder() {
    }

    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

    @Override
    public int length() {
        return count;
    }

    public int capacity() {
        return value.length;
    }
}

你可能感兴趣的:(java String StringBuilder StringBuffer)