jdk8源码阅读-1.3

java.lang.StringBuffer和java.lang.StringBuilder

StringBuffer和StringBuilder类似于String,但可以修改。在任何时间点,它都包含一些特定的字符序列,但是序列的长度和内容可以通过某些方法调用来更改。

共同继承了java.lang.AbstractStringBuilder:一个抽象类,用来实现可变的字符序列。实现一个可修改的字符串。在任何时间点,它都包含一些特定的字符序列,但是序列的长度和内容可以通过某些方法调用来更改。该抽象类有两个实例变量:1.char[] value:用于字符存储2.int count:记录使用的字符数

共同实现了两个接口:

  1. java.io.Serializable:序列化接口没有方法或字段,仅用于标识可序列化的语义。
  2. CharSequence:CharSequence是一个可读的字符值序列。这个接口提供了对许多不同类型的字符序列的统一的只读访问。

StringBuffer独有的一个实例变量:

  1. transient char[] toStringCache:toString返回的最后一个值的缓存。每当修改StringBuffer时清除。transient关键字修饰导致不被序列化,其优点是可以节省存储空间,优化程序。随之而来的是会导致被transient修饰的字段会重新计算,初始化。

共有的一个静态变量:

  1. static final long serialVersionUID;在 Java 中,serialVersionUID 是一个用于标识序列化类版本的特殊字段。它是一个长整型数值,通常在实现 Serializable 接口的类中使用,用于确保序列化和反序列化的一致性。两个类的该变量值不同

一.构造器

  1. ():无参构造器,底层是调用AbstractStringBuilder的有参构造创建了一个容量16的默认StringBuffer/StringBuilder对象
  2. (int capacity):有参构造,创建一个指定容量的StringBuffer/StringBuilder对象
  3. (String str):构造一个初始化为指定字符串内容的StringBuffer/StringBuilder对象。字符串缓冲区的初始容量是16加上字符串参数的长度。步骤是先根据大小创建char[],然后append添加字符串
  4. (CharSequence seq):构造一个包含与指定CharSequence相同字符的StringBuffer/StringBuilder对象。初始容量是16加上CharSequence参数的长度。如果指定的CharSequence的长度小于或等于零,则返回容量为16的空缓冲区。

二.实例方法

StringBuffer独有的并且有synchronized关键字修饰,线程安全的方法:

  1. int length():返回StringBuffer对象中的字符串的长度
  2. int capacity():返回StringBuffer的总容量
  3. void ensureCapacity(int minimumCapacity):确保容量至少等于指定的最小值。如果当前容量小于参数,则分配一个具有更大容量的新内部数组。新容量是以下两个容量中较大的一个:minimumCapacity参数。原来容量的两倍,加上2。
  4. void trimToSize():减少StringBuffer的容量,底层调用Arrays.copyOf
  5. void setLength(int newLength):设置字符序列的长度。如果newLength参数小于当前长度,则将长度更改为指定的长度。如果newLength参数大于或等于当前长度,则会追加足够的空字符('\u0000'),以便length成为newLength参数。
  6. char charAt(int index):返回指定索引处的字符
  7. int codePointAt(int index):此方法接受一个int类型参数索引,该索引表示要返回其unicode值的字符的索引。
  8. int codePointBefore(int index):方法返回字符串中指定索引之前的字符的Unicode值。
  9. int codePointCount(int beginIndex, int endIndex):返回此序列的指定文本范围内的Unicode值。
  10. int offsetByCodePoints(int index, int codePointOffset):返回此序列中的索引,该索引与给定索引的偏移量为codePointOffset
  11. void getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin):字符从这个序列复制到目标字符数组dst。要复制的第一个字符位于索引srcBegin;要复制的最后一个字符位于索引srcnd -1处。
  12. void setCharAt(int index, char ch):指定索引处的字符被设置为ch。

StringBuffer和StringBuilder共有的方法,不同点在于StringBuffer有synchronized关键字修饰,并且对StringBuffer字符串的修改之前会将toStringCache缓存设置为null(方法返回值类型为各自对应的类型,这里以StringBuffer为代表,可替换为StringBuilder)

  1. StringBuffer append(Object obj):追加Object参数的字符串表示形式。此外,除了Object对象之外,还有丰富的参数形式,如StringBuffer对象,long,float,int,char[]等,效果相同。
  2. StringBuffer delete(int start, int end):删除此序列的子字符串中的字符。子字符串从指定的起始点开始,并扩展到索引end - 1处的字符,如果不存在这样的字符,则扩展到序列的末尾。
  3. StringBuffer deleteCharAt(int index):移除此序列中指定位置的字符。
  4. StringBuffer replace(int start, int end, String str):将此序列的子字符串中的字符替换为指定String中的字符。子字符串从指定的起始点开始,并扩展到索引end - 1处的字符,如果不存在这样的字符,则扩展到序列的末尾。
  5. StringBuffer insert(int offset, Object obj):在指定索引处插入obj.valueOf()实际是在指定位置处插入字符串。此方法也提供了丰富的的参数类型。
  6. int indexOf(String str, int fromIndex):返回该字符串中指定子字符串的第一次出现的索引,从指定的索引开始。
  7. int lastIndexOf(String str):返回该字符串中指定子字符串的最后一次出现的索引
  8. StringBuffer reverse():反转字符串
  9. String toString():在该方法上,StringBuilder是直接返回一个新的字符串对象,而StringBuffer则是先检查缓存是否有数据,有的话在缓存中取,没有的话,先放缓存,再从缓存取
  10. void writeObject(java.io. ObjectOutputStream s):将StringBuffer/StringBuilder实例的状态保存到一个流中(也就是说,序列化它)。
  11. void readObject(java.io.ObjectInputStream s):调用readObject从流中恢复StringBuffer/StringBuilder的状态。在这两个方法中要注意StringBuffer对象的实例变量有transient关键字修饰,并不会被序列化,反序列化后取得的值为null

全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务