首页 > 代码库 > 字符串连接操作下的String和StringBuilder(二)

字符串连接操作下的String和StringBuilder(二)

重点关注StringBuilder的append方法

 

使用source insight查看Jdk中提供的源码 定位到StringBuilder.java

搜索append方法 定位到append方法的一种重载

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

可见是调用父类的append方法

 

定位到父类的append(String str)方法

    public AbstractStringBuilder append(String str) {    if (str == null) str = "null";        int len = str.length();    if (len == 0) return this;    int newCount = count + len;    if (newCount > value.length)        expandCapacity(newCount);    str.getChars(0, len, value, count);    count = newCount;    return this;    }

str为空和Len为0的情况不作叙述。

 

value的定义(char类型数组)

   /**     * The value is used for character storage.     */    char value[];

count的定义(数组中已使用的)

    /**      * The count is the number of characters used.     */    int count;

 

int newCount = count + len;    if (newCount > value.length)        expandCapacity(newCount);

 

newCount得到新的长度 和默认的字符数组长度作对比 

如果append一个字符串之后长度超过默认value数组的长度就对其做扩容操作

    /**     * This implements the expansion semantics of ensureCapacity with no     * size check or synchronization.     */    void expandCapacity(int minimumCapacity) {    int newCapacity = (value.length + 1) * 2;        if (newCapacity < 0) {            newCapacity = Integer.MAX_VALUE;        } else if (minimumCapacity > newCapacity) {        newCapacity = minimumCapacity;    }        value = Arrays.copyOf(value, newCapacity);    }

char数组容量扩大至原来的2倍

将原有数据拷贝到新数组中。

 

子类的append的方法返回值类型为StringBuilder 父类的为AbstractStringBuilder类型

他们之间的转换牵扯到向上转型或者向下转型。

 

至于其他的append重载方法  操作与此相似。