StringBUilder类源码阅读

本文详细介绍了StringBuilder的源码,包括其继承自AbstractStringBuilder类,实现Appendable和CharSequence接口,以及自身的构造函数、成员变量和成员函数。重点讲解了AbstractStringBuilder的核心方法如ensureCapacity,字符序列的追加、删除、替换等操作,并探讨了字符序列的序列化和反序列化过程。
摘要由CSDN通过智能技术生成

1.父类

                   StringBuilder继承自AbstractStringBuilder类,自身被final修饰,所以不能成为其他类的父类。

AbstractStringBuilde接口

                  AbstractStringBuilder拥有Appendable, CharSequence两个接口。

                ——CharSequence 字符序列接口,代表该类,或其子类是一个字符序列。

  • int  length()              返回字符序列中的字符的长度
  • char  charAt(int index)               返回字符序列中第index个字符,index是索引,该函数相当于数组下标的形调用字符序列的元素。
  • CharSequence subSequence(int start, int end)                子串,返回一个从start到end(不含)的字符序列。

  • public String toString()              输出一个和字符序列相同的字符串。

  • public default IntStream chars()            返回一个 int的流,从这个序列中零扩展 char值。

  •  

——Appendable  能够被追加 char 序列和值的对象。如果某个类的实例打算接收来自 Formatter 的格式化输出,那么该类必须实现 Appendable 接口。

  • Appendable append(CharSequence csq) throws IOException            向此 Appendable 追加指定字符。

  • Appendable append(CharSequence csq, int start, int end)                  向此 Appendable 追加指定字符序列的子序列。

  • Appendable append(char c)                                                                  向此 Appendable 追加指定字符。

AbstractStringBuilder成员函数及变量

1. 成员变量

  • char[] value          存储字符

  • int count               用来记录已存储字符的数量

2.成员函数

  • AbstractStringBuilder()         无参的构造函数

  • AbstractStringBuilder(int capacity)           有参的构造函数,用于指定字符数组value的容量

  • public int length()      用于获取字符数组的有实际长度

  • public int capacity()      用于获取字符数组的最大长度

  • public void ensureCapacity(int minimumCapacity)       用于确保容量至少等于指定的最小值,是AbstractStringBuilder类的核心也是其两个实现类StringBuffer和StringBuilder的核心。

  • private void ensureCapacityInternal(int minimumCapacity)      字符数组扩容的方法的一部分,判断minimumCapacity是否有效,即是否大于0,大于0执行ensureCapacityInternal方法,小于等于0则忽略。

  • void expandCapacity(int minimumCapacity)        数组扩容,判断更改的容量值是否比原容量大,如果大于原容量,则创建一个新容量的数组,然后再将原数组中的内容拷贝到新数组中,如果小于或等于原容量则忽略。

  • public void trimToSize()      减少字符序列的使用空间,释放掉没有存储数据的内存,也就是让字符数组的实际长度和容量相等,此操作通过申请一个长度为count的新空间来实现。

  •  public void setLength(int newLength)      用空字符填充未使用的空间。

  • public char charAt(int index)      获取字符序列中指定位置index的字符,范围为0到count,超出范围抛StringIndexOutOfBoundsException异常。

  • public int codePointAt(int index)     获取字符序列中指定位置的字符。

  • public int codePointBefore(int index)     获取字符序列中指定位置的前一个位置的字符。

  • public int codePointCount(int beginIndex, int endIndex)       获取字符串的字符个数。

  • public int offsetByCodePoints(int index, int codePointOffset)        返回此字符序列中index后codePointOffset个代码点的索引。

  • public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)          把字符序列中从srcBegin到srcEnd的字符复制到dst字符数组中从dstBegin开始往后的位置中。

  • public void setCharAt(int index, char ch)       更改index处的字符为ch

  • public AbstractStringBuilder append(Object obj)         在原字符序列后添加给定的对象的字符序列。

  • public AbstractStringBuilder append(String str)           在原字符序列后添加给定的字符序列。

  •  public AbstractStringBuilder append(StringBuffer sb)         在原字符序列后添加给定的StringBuffer对象的字符序列。

  • AbstractStringBuilder append(AbstractStringBuilder asb)         在原字符序列后添加给定的StringBuilder对象的字符序列。

  • public AbstractStringBuilder append(CharSequence s)        在原字符序列后添加给定的CharSequence对象的字符序列。

  • private AbstractStringBuilder appendNull()         在原字符序列后添加“null”字符序列。

  • public AbstractStringBuilder append(CharSequence s, int start, int end)           在原字符序列后添加给定的CharSequence对象从start开始到end为止的子序列。

  • public AbstractStringBuilder append(char[] str)         在原字符序列后添加给定字符序列。

  • public AbstractStringBuilder append(char str[], int offset, int len)     在原字符序列后添加给定的字符序列从start开始到end为止的子序列。

  • public AbstractStringBuilder append(boolean b)         在原字符序列后添加一个布尔值(“true”或“false”)。

  • public AbstractStringBuilder append(char c)        在原字符序列后添加一个字符。

  • public AbstractStringBuilder append(int i)         在原字符序列后添加一个整形。//类似作用的还有append(long l)  ,append(float f),append(double d)

  • public AbstractStringBuilder delete(int start, int end)        删除字符序列指定区间的内容,但不改变原序列的容量。

  • public AbstractStringBuilder deleteCharAt(int index)        删除字符序列指定位置的字符,不改变原序列的容量

  •  public AbstractStringBuilder replace(int start, int end, String str)        将原字符序列指定区间start到end区间内的内容替换为str,替换过程中序列长度会改变。

  • public String substring(int start)          返回字符序列从start到count的子序列。

  •  public CharSequence subSequence(int start, int end)           返回字符序列从start到end的子序列。

  • public String substring(int start, int end)        返回字符序列从start到end的子序列。

  • public AbstractStringBuilder insert(……)           一系列insert方法都是在字符序列的指定位置插入给定的字符序列,或者给定对象的字符序列,基础数类型转成的字符序列。

  • public int indexOf(String str)         查询给定字符序列在原字符序列中第一次出现的位置。

  • public int indexOf(String str, int fromIndex)          查询给定字符序列在原字符序列中从指定位置后面第一次出现的位置。

  • public int lastIndexOf(String str)                 查询给定字符序列在原字符序列中最后一次出现的位置。

  •  public AbstractStringBuilder reverse()          将字符序列反转。

  •  private void reverseAllValidSurrogatePairs()        在反转过程中对某些特定的字符做特殊处理,因为一些字符用UTF-16表示,而char只有8位,存储这些字符要用两个char。显然这时候按常规反转字符序列是有问题的,该函数就是专门处理这种情况的。

  •  public abstract String toString()         抽象方法,需要子类去实现。用于转化为为字符串。

  • final char[] getValue()        返回字符序列。

   

2.接口

StringBuilder拥有java.io.Serializable, CharSequence两个接口。

 ——java.io.Serializable 序列化接口。

把原本在内存中的对象状态变成可存储或传输的过程称之为序列化。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。Serializable接口没有方法和字段。

——CharSequence接口内容与父类相同。

 

3.成员变量和成员函数

变量:

  • static final long serialVersionUID = 4383685877147921099L;     

函数

  • public StringBuilder()         默认构造函数,调用了父类的有参构造函数,传入参数16,默认字符数组的容量为16。

  • public StringBuilder(int capacity)    有参的构造函数,指定字符数组的长度为capacity。

  • public StringBuilder(String str)       有参的构造函数,指定字符数组的长度为传入的字符串的长度加16。

  • public StringBuilder(CharSequence seq)      有参的构造函数,指定字符数组的长度为传入的对象的字符序列的长度加16。

  • append系列方法         调用相应的父类的append方法,并将传入的参数传给父类。

  • public StringBuilder delete(int start, int end)          调用相应的父类的delete方法,删除字符序列指定区间的内容,但不改变原序列的容量。

  • public StringBuilder deleteCharAt(int index)          调用相应的父类的delete方法,删除字符序列指定位置的字符,但不改变原序列的容量。

  • public StringBuilder replace(int start, int end, String str)           调用相应的父类的replace方法,将原字符序列指定区间start到end区间内的内容替换为str,替换过程中序列长度会改变。

  • public String substring(int start)          调用相应的父类的substring方法,返回字符序列从start到count的子序列。

  •  public CharSequence subSequence(int start, int end)           调用相应的父类的subSequence方法,返回字符序列从start到end的子序列。

  • public String substring(int start, int end)        调用相应的父类的substring方法,返回字符序列从start到end的子序列。

  • public StringBuilder insert(……)           一系列insert方法都是调用父类方法,在字符序列的指定位置插入给定的字符序列,或者给定对象的字符序列,基础数类型转成的字符序列。

  • public int indexOf(String str)         调用相应的父类的indexOf方法,查询给定字符序列在原字符序列中第一次出现的位置。

  • public int indexOf(String str, int fromIndex)          调用相应的父类的indexOf方法,查询给定字符序列在原字符序列中从指定位置后面第一次出现的位置。

  • public int lastIndexOf(String str)                 调用相应的父类的 lastIndexOf方法,查询给定字符序列在原字符序列中最后一次出现的位置。

  •  public StringBuilder reverse()          调用相应的父类的reverse方法,将字符序列反转。

  •  private void reverseAllValidSurrogatePairs()        调用相应的父类的reverseAllValidSurrogatePairs方法,在反转过程中对某些特定的字符做特殊处理,因为一些字符用UTF-16表示,而char只有8位,存储这些字符要用两个char。该函数就是专门处理这种情况的。

  •  public abstract String toString()         返回StringBuilder对象的字符串形式。

  • private void writeObject(java.io.ObjectOutputStream s)           在序列化的时候保存StringBuilder对象的状态到一个流中。

  • private void readObject(java.io.ObjectInputStream s)              反序列化时从流中获取StringBuild对象序列化之前的状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值