[十三]基础数据类型之AbstractStringBuilder

 
String内部是一个private final char value[];
也就意味着每次调用的各类处理方法,返回的字符串都是一个新的,性能上,显然....
因此,对于可变字符序列的需求是很明确的
 
类的层次结构设计,有的时候是自顶而下
有的时候是总结概括,而后抽象出来一个新的类,这很正常
尽管StringBuffer 要比StringBuilder 和 AbstractStringBuilder要早得多了
可是StringBuffer 如今也继承了这个类
image_5bcd62fe_1137
因此说,抛开发展历史的过程不说,直接从类的层级结构设计的角度看的话
你能够认为AbstractStringBuilder 就是对于可变字符序列的这一律念的描述
他提供了可变字符序列的一个基本协议约定,也就是基本的功能方法
做为一个抽象类, 而且也提供了一部分默认的实现
StringBuffer和StringBuilder都是可变的字符序列,因此他们都实现了AbstractStringBuilder
image_5bcd62fe_2581
 

属性简介

内部是一个char[] value再也不是final的了,也就意味着可变
他实现了CharSequence接口意味着他是一个字符序列
实现了Appendable接口,意味着他遵循了追加相关的协议
image_5bcd62fe_7963
内部使用char[] value进行数据存储 , 这个char[] value 是核心
他是有容量大小的,由于数组必然有长度
若是长度没有超出此容量,就无需分配新的内部缓冲区数组
若是内部缓冲区溢出,则此容量自动增大
 
使用count 记录已经使用的字符个数
 
还能够经过有参数的构造方法进行初始化设置value这个字符数组的大小
固然构造方法不是给你用的,是给子类用的
 
既然本质是一个char[] 字符数组,因此能够说全部的操做都是对于数组的操做
那么对于一个字符序列,有哪些方法是刚需呢?
也无外乎添加元素/删除元素/更新元素/获取元素 这几种
添加有多是插入中间或者在最后追加
 
咱们知道,数组是顺序存储
因此对于插入这种操做必然会出现大量的元素移动状况
 

属性获取

既然是内部维护了字节数组
必然这个数组自己属性,长度 ,使用个数的获取,以及数组的扩大也有相对应的方法可使用
length() 获取实际数据的个数
capacity() 数组的大小 因此是容量
image_5bcd62fe_1c6e
public void setLength(int newLength) 设置为指定长度

若是 newLength 参数小于当前长度
则长度将更改成指定的长度, 截断,数据不变
 
若是 newLength 参数大于或等于当前长度
则将追加有效的 null 字符 ('\u0000'),使长度知足 newLength 参数
public void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值
若是 minimumCapacity 参数为非正数,则此方法不执行任何操做并返回
image_5bcd62fe_2467
 
参数大于当前容量才会执行扩展
image_5bcd62fe_119a
 
新容量的大小应大于:minimumCapacity 参数 而且大于 旧容量的两倍加 2  
 
public void trimToSize() 尝试缩减空间
若是实际使用的个数小于容量,那么进行缩减
image_5bcd62fe_7157
 

添加方法

就像咱们刚才说的那样,添加元素,分为尾部追加元素中间插入元素
添加元素的方法也分为了两大阵营
AbstractStringBuilder append(Object obj) AbstractStringBuilder insert(int offset, Object obj) 
AbstractStringBuilder append(boolean b) AbstractStringBuilder insert(int offset, boolean b)
AbstractStringBuilder append(char c)
AbstractStringBuilder insert(int offset, char c)
AbstractStringBuilder append(int i) AbstractStringBuilder insert(int offset, int i)
AbstractStringBuilder append(long l) AbstractStringBuilder insert(int offset, long l)
AbstractStringBuilder append(float f) AbstractStringBuilder insert(int offset, float f)
AbstractStringBuilder append(double d) AbstractStringBuilder insert(int offset, double d)
AbstractStringBuilder append(CharSequence s) AbstractStringBuilder insert(int dstOffset, CharSequence s)
AbstractStringBuilder append(CharSequence s, int start, int end)
AbstractStringBuilder insert(int dstOffset, CharSequence s,int start, int end)
AbstractStringBuilder append(char[] str) AbstractStringBuilder insert(int offset, char[] str)
AbstractStringBuilder append(char str[], int offset, int len)
AbstractStringBuilder insert(int index, char[] str, int offset, int len)
AbstractStringBuilder append(String str) AbstractStringBuilder insert(int offset, String str)
AbstractStringBuilder append(StringBuffer sb)  
AbstractStringBuilder appendCodePoint(int codePoint)  
 
 
从上表能够看得出来,给各类数据类型都提供了append和insert方法
对于insert 是插入,既然是插入,那么就须要指定位置
因此与append对应的方法的方法签名上,都多了一个索引
全部的方法的返回类型都是AbstractStringBuilder
其实都是
return this;
由于他是可变的,因此变化直接体如今了this中,因此返回this就行了
appendCodePoint(int codePoint) 与  append(char c)  能够说是同样的
可是对于辅助平面显然又不同,char不支持辅助平面
 

获取方法 

获取代码点

代码点相关的五个方法
charAt(int) / codePointAt(int) / codePointBefore(int) / codePointCount(int, int) / offsetByCodePoints(int, int)
他们与String中的是如出一辙的,代码也是同样的(就有个变量名变更)
 

复制 

getChars(int, int, char[], int)
将字符今后序列复制到目标字符数组 dst  与String中的方法也几乎一致

索引下标

int indexOf(String str)
int indexOf(String str, int fromIndex)
第一次出现的指定子字符串在该字符串中的索引
能够指定索引
指定索引就从索引处开始查找匹配
知足的条件为startsWith true (而且在范围内 若是有设置)
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex)
返回最右边出现的指定子字符串在此字符串中的索引 
也就是最后一个
能够指定索引
指定索引就从索引处 反向匹配
知足的条件也是startsWith true (而且在范围内 若是有设置)

获取子串

public 
String substring(int start, int end)
根据索引返回子串
image_5bcd62fe_780d
public String substring(int start) substring(int start, int end)的简化方法
指定开始位置,默认结束位置为最后
image_5bcd62fe_5e54
public
CharSequence subSequence(int start, int end)
为了实现CharSequence方法
内部调用的substring
image_5bcd62fe_37b8
 

更新方法

更新方法比较少,由于是数组
数组的访问按照下标进行设置就行了
还提供了替换的功能,也算是更新操做
image_5bcd62fe_5494
AbstractStringBuilder replace(int start, int end, String str)
使用str替换对象中从start 开始到end结束的这一段 
 

删除方法

AbstractStringBuilder delete(int start, int end) 删除指定范围的char
image_5bcd62fe_59d5
AbstractStringBuilder deleteCharAt(int index)  删除某个位置的char
image_5bcd62ff_71c3
 
 

其余方法

reverse()
按照字符进行翻转
将此字符序列用其反转形式取代
就是翻转每个char,注意可不是翻转比特位,也不是翻转字节,反转的是代码单元
不过对于辅助平面的字符的代码点,他们会按照字符进行翻转,也就是高代理低代理顺序不会改变
执行操做前未成对的低代理项和高代理项将成为代理项对
例如,反转 "\uDC00\uD800" 将生成有效的代理项对 "\uD800\uDC00"
 

总结

如同咱们上面说的,AbstractStringBuilder就是  可变 字符序列的一个纲领
它规定了可变字符序列应该有的行为
好比 添加字符/删除字符/更新字符/获取字符
由于可变,因此对于可变的支持,天然是必不可少的
另外,他做为String在不少方面的一个替代,必然也是提供了String的一些功能方法
不然与String API 变化巨大 也是毫无心义
由于毕竟自己就是为了描述字符序列
因此对于AbstractStringBuilder  只须要完全理解了他做为 可变字符序列的标准接口便可
相关文章
相关标签/搜索