java.lang.StringBuilder源码分析

StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类。它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringBuffer的。建议使用它而不是StringBuffer,因为它的速度更快。

StringBuilder有自己的容量(字符数组),当容量还没有被占满的时候,不必申请新的空间,当容量被占满后,它会自动地扩容。

public final class StringBuilder extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence {
    public StringBuilder() {//构造方法只是调用父类的构造器
        super(16);
    }
    
    public StringBuilder(int capacity) {//capacity指定容量大小
        super(capacity);
    }

    public StringBuilder(String str) {//str指定初始容器存放的字符串,容量是str.length+16
        super(str.length() + 16);
        append(str);
    }

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

  //StringBuilder重载了父类所有的append方法,以支持添加任何类型的数据到容器中 @Override
public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder append(String str) { super.append(str); return this; } public StringBuilder append(StringBuffer sb) { super.append(sb); return this; } @Override public StringBuilder append(CharSequence s) { super.append(s); return this; } public StringBuilder append(CharSequence s, int start, int end) { super.append(s, start, end); return this; } @Override public StringBuilder append(char[] str) { super.append(str); return this; } //...更多的append重载方法,实现在StringBuilder append所有数据类型 public StringBuilder appendCodePoint(int codePoint) {//这个方法是通过Unicode编码来append一个字符,比如'a'的Unicode=97,appendCodePoint(97)相当于把a添加到容器末尾 super.appendCodePoint(codePoint); return this; } public StringBuilder delete(int start, int end) {//删除end-start的子串 super.delete(start, end); return this; } public StringBuilder deleteCharAt(int index) {//删除index下标的字符 super.deleteCharAt(index); return this; } public StringBuilder replace(int start, int end, String str) {//用str取代end-start的子串 super.replace(start, end, str); return this; }
  //insert方法实现在字符串的任意位置插入数据
public StringBuilder insert(int index, char[] str, int offset, int len) { super.insert(index, str, offset, len); return this; } //...更多的insert重载方法 public int indexOf(String str) {//找到子串的起始位置 return super.indexOf(str); } //...更多的indexOf重载方法,实现找到子串的位置 public StringBuilder reverse() {//将容器内的字符串倒转 super.reverse(); return this; } public String toString() {//toString是返回new一个String对象 // Create a copy, don't share the array return new String(value, 0, count); } private void writeObject(java.io.ObjectOutputStream s)//writeObeject提供序列化机制 throws java.io.IOException { s.defaultWriteObject(); s.writeInt(count); s.writeObject(value); } private void readObject(java.io.ObjectInputStream s)//readObject提供反序列化机制 throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); count = s.readInt(); value = (char[]) s.readObject(); } }

StringBuilder内部维护一个字符数组,在这个字符数组上对字符进行各种操作,当需要对字符串进行频繁操作时,StringBuilder能提供很好的性能,比起直接操作String,它不需要创建很多对象。

    原文作者:没有梦想的小灰灰
    原文地址: https://www.cnblogs.com/13jhzeng/p/5618500.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞