AbstractStringBuilder是一个抽象类,它是StringBuffer和StringBuilder的父类,内部使用char数组实现。
存储结构
1 | char[] value; |
构造方法
1 | AbstractStringBuilder(int capacity) { |
append方法
这里仅分析下追加布尔型和整型。
追加布尔型
1 | // 构造器模式 |
追加整型
1 | public AbstractStringBuilder append(int i) { |
这里调用了Integer类的两个静态方法:
Integer.stringSize方法用于计算给定整数x的位数(x必须为正数);
Integer.getChars方法用于将整数转变为字符数组。
1.首先,我们来看下Integer.stringSize方法。
1 | // 存储int范围内不同位数的最大值 |
该方法比较简单,但却十分实用。
它事先存储了int范围内不同位数的最大值,然后将给定的正数x与这些最大值逐一进行比较,从而得到x的位数,避免了除法运算。
2.接着,我们再来看下Integer.getChars方法。
1 | // java.lang.Integer.getChars |
Integer.getChars会将负数转变为其相反数来处理,因此该方法无法处理Integer.MIN_VALUE,会导致向上溢出。
此外,在JDK中,几乎所有的乘除运算,都采用了位移运算来优化。比如上面的q = (i * 52429) >>> (16+3);
$$
\begin{align}
q &= (i * 52429) >>> (16+3) \\
&= \frac{i \times 52429} {65536 \times 8} = \frac{i \times 6553.625} {65536} \\
&\approx 0.1 \times i = i / 10
\end{align}
$$
Integer类事先存储了各个数字对应的字符(数组digits),以及100以内各数字个位和十位对应的字符(数组DigitOnes和DigitTens)。
1 | final static char[] digits = { |
扩容操作
新的容量为newCapacity = (value.length << 1) + 2
。
1 | private void ensureCapacityInternal(int minimumCapacity) { |
取值操作
1 | public char charAt(int index) { |
删除操作
使用数组复制来实现。
1 | public AbstractStringBuilder deleteCharAt(int index) { |