从头开始学JDK-------StringBuilder

目录

* StringBuilder #可变原因

* StringBuilder #扩容机制

* StringBuilder #append(String)

* StringBuilder #toString


* StringBuilder #可变原因

        StringBuilder是一个可变的字符串,内部与String一样,维护的是一个char[] value数组。初始容量为16。

    public StringBuilder() {
        int capacity = 16;
        value = new char[capacity];
    }

* StringBuilder #扩容机制

        每次添加新的元素之前,要判断内部的char[] value数组是否能够支持够用。如果不够用,需要扩容。

        每次扩容大小:【 2倍原大小 + 2 】。默认char[] value 长度为16。

    void expandCapacity(int minimumCapacity) {

        int newCapacity = value.length * 2 + 2;

        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
       
        value = Arrays.copyOf(value, newCapacity);
    }

* 衍生 ArrayList初始化容量与扩容

        无参的ArrayList起初是一个空数组,在第一次添加元素10个以下元素的时候容量修改成10。

        ArrayList每次扩容成上次的1.5倍。实现原理一样,使用Arrays.copyOf(value,newCapacity)

* StringBuilder #append(String)

        链式调用经典案例。方法返回this

public StringBuilder append(String str) ...

        if (str == null} {
          return append("null");
        }
            
        int len = str.length();
        ensureCapacityInternal(count + len);
        //把str从0到结尾,添加到char[] value中,从value的第count位(末尾)处开始
        str.getChars(0, len, value, count);
        count += len;
        return this;

* StringBuilder #toString

        toString()方法重新把内部的char[] value数组,通过String的构造函数,重新创建一个字符串对象。

@Override
public String toString() {
	// Create a copy, don't share the array
	return new String(value, 0, count);
}

* 衍生 StringBuffer # toString

        StringBuffer与StringBuilder有是否加锁的区别

        StringBuffer增加了缓冲区。每次toString的时候都会使用缓冲区的toStringCache来构造字符串。

        StringBuffer在每次改变内部char[] value数组之前,都会清除toStringCache缓存。

class StringBuffer ...

public synchronized String toString() {
    if (toStringCache == null) {
    	toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

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

 

posted @ 2022-07-17 12:13  小大宇  阅读(3)  评论(0编辑  收藏  举报