当前位置: 代码迷 >> 综合 >> 剖析JDK源码-AbstractStringBuilder-(7)
  详细解决方案

剖析JDK源码-AbstractStringBuilder-(7)

热度:23   发布时间:2024-02-19 15:55:35.0

剖析JDK源码-AbstractStringBuilder-(7)

一、简述

  • 一个神秘的抽象类(在jdk API文档找不到的类)。
  • 通过工具查看,是StringBuffer和StringBuilder的直接父类;
    在这里插入图片描述
  • 在jdk1.5时编写的,而StringBuffer是在jdk1.0时编写的,乍看像是先有儿后有父的疑惑;其实不然,AbstractStringBuilder是在开发StringBuilder时,将两者的共性抽离出来的。
  • AbstractStringBuilder本身也是一个字符容器(字符串生成器),
  • 更方便开发者在编写自定义容器时可以直接继承AbstractStringBuilder。

二、源码

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;int count;private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
}
  • 被关键字abstract 修饰,说明是一个抽象类,不可以直接实例化对象,只能被继承。
  • 实现了Appendable类(可附加序列化和值)和CharSequence类(字符序列化)。
  • 有三个变量属性:字符数组和数量;定义最大字符数组的长度。
    如下定义数组就会报错:内存溢出
 String [] str = new String[Integer.MAX_VALUE];

三、构造方法

1、无参,子类在实例化对象时必会执行这一个方法,因为对于子类的序列化是必需的。

 AbstractStringBuilder() {
    }

2、创建具有指定容量的AbstractStringBuilder容器。

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

在子类中,就是super本方法
在这里插入图片描述

四、内部方法

1、public int length();返回字符长度。
2、public int capacity();返回当前容器容量。
3、public void ensureCapacity(int minimumCapacity);改变容器容量,且只进行扩容。

//只对正整数
public void ensureCapacity(int minimumCapacity) {
    if (minimumCapacity > 0)ensureCapacityInternal(minimumCapacity);}//只对大于当前容量值的数值 private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious codeif (minimumCapacity - value.length > 0) {
    value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}private int newCapacity(int minCapacity) {
    // overflow-conscious codeint newCapacity = (value.length << 1) + 2;if (newCapacity - minCapacity < 0) {
    newCapacity = minCapacity;}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;}private int hugeCapacity(int minCapacity) {
    if (Integer.MAX_VALUE - minCapacity < 0) {
     // overflowthrow new OutOfMemoryError();}return (minCapacity > MAX_ARRAY_SIZE)? minCapacity : MAX_ARRAY_SIZE;}

4、public void trimToSize() ;尝试减少字符序列化的空间。
5、public void setLength(int newLength);设置字符序列的长度。
6、public char charAt(int index);返回指定索引处的字符。
7、public int codePointAt(int index);返回指定索引处的字符(Unicode代码点)。
8、 public int codePointBefore(int index);返回指定索引处前一个的字符(Unicode代码点)。
9、public int codePointCount(int beginIndex, int endIndex);返回指定索引区间的字符(Unicode代码点)。
10、public int offsetByCodePoints(int index, int codePointOffset);返回指定索引和指定偏移量间的代码点。
11、public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);复制指定位置段的字符到指定位置。
12、public void setCharAt(int index, char ch);修改指定索引的字符。
13、public AbstractStringBuilder append(Object obj);附加对象的字符形式到当前容器。
14、public AbstractStringBuilder append(String str);附加字符串到当前容器。
15、 public AbstractStringBuilder append(StringBuffer sb);
16、AbstractStringBuilder append(AbstractStringBuilder asb);
17、public AbstractStringBuilder append(CharSequence s);
18、private AbstractStringBuilder appendNull();附加字符“null”。
19、public AbstractStringBuilder append(CharSequence s, int start, int end);附加指定索引字符序列。
20、public AbstractStringBuilder append(char[] str);
21、public AbstractStringBuilder append(char str[], int offset, int len);
22、 public AbstractStringBuilder append(boolean b);附加字符“true”或者false”。
23、public AbstractStringBuilder append(char c);
24、public AbstractStringBuilder append(int i);
25、public AbstractStringBuilder append(long l);
26、public AbstractStringBuilder append(float f);
27、public AbstractStringBuilder append(double d);
28、public AbstractStringBuilder delete(int start, int end);删除指定索引的字符段。
29、public AbstractStringBuilder appendCodePoint(int codePoint);附件序列。
30、public AbstractStringBuilder deleteCharAt(int index);删除指定字符。
31、public AbstractStringBuilder replace(int start, int end, String str);替换指定区间内字符。
32、public String substring(int start);返回指定起点的字符串。
33、public String substring(int start, int end);返回指定起止的字符串。
34、public CharSequence subSequence(int start, int end);返回指定区间的字符序列。
35、public AbstractStringBuilder insert(int index, char[] str, int offset,int len);插入字符串序列。
36、public AbstractStringBuilder insert(int offset, Object obj);插入对象的字符串形式序列。
37、public AbstractStringBuilder insert(int offset, String str);
38、public AbstractStringBuilder insert(int offset, char[] str);
39、public AbstractStringBuilder insert(int dstOffset, CharSequence s);
40、public AbstractStringBuilder insert(int offset, boolean b);
41、public AbstractStringBuilder insert(int offset, char c);
42、public AbstractStringBuilder insert(int offset, int i);
43、public AbstractStringBuilder insert(int offset, long l);
44、public AbstractStringBuilder insert(int offset, float f);
45、public AbstractStringBuilder insert(int offset, double d);
- append是附加到后面,而insert可以插入到指定位置
46、public int indexOf(String str);返回第一次出现指定字符串的索引。
47、public int indexOf(String str, int fromIndex);从指定索引位置起,返回第一次出现指定字符串的索引
48、public int lastIndexOf(String str);返回该字符串中最后出现指定子字符串的索引。
49、public int lastIndexOf(String str, int fromIndex);从指定索引位置起,返回最后出现指定子字符串的索引。
50、public AbstractStringBuilder reverse();
51、 public abstract String toString();
52、final char[] getValue();返回字符数组。

注:显然一些基本的操作都在子类中体现出来了。