[十三]基础数据类型之AbstractStringBuilder
程序员文章站
2022-07-02 15:49:50
本文对进行了AbstractStringBuilder简单介绍,对AbstractStringBuilder进行源码分析,从方法列表的解读去理解AbstractStringBuilder,AbstractStringBuilder详解 ......
string内部是一个private final char value[];
也就意味着每次调用的各种处理方法,返回的字符串都是一个新的,性能上,显然....
所以,对于可变字符序列的需求是很明确的
类的层次结构设计,有的时候是自顶而下
有的时候是总结归纳,然后抽象出来一个新的类,这很正常
尽管stringbuffer 要比stringbuilder 和 abstractstringbuilder要早得多了
但是stringbuffer 现在也继承了这个类
所以说,抛开发展历史的过程不说,直接从类的层级结构设计的角度看的话
你可以认为abstractstringbuilder 就是对于可变字符序列的这一概念的描述
他提供了可变字符序列的一个基本协议约定,也就是基本的功能方法
作为一个抽象类, 并且也提供了一部分默认的实现
stringbuffer和stringbuilder都是可变的字符序列,所以他们都实现了abstractstringbuilder
|
属性简介
内部是一个char[] value,不再是final的了,也就意味着可变
他实现了charsequence接口意味着他是一个字符序列
实现了appendable接口,意味着他遵循了追加相关的协议
|
内部使用char[] value进行数据存储 , 这个char[] value 是核心
他是有容量大小的,因为数组必然有长度
如果长度没有超出此容量,就无需分配新的内部缓冲区数组
如果内部缓冲区溢出,则此容量自动增大
使用count 记录已经使用的字符个数
还可以通过有参数的构造方法进行初始化设置value这个字符数组的大小
当然构造方法不是给你用的,是给子类用的
既然本质是一个char[] 字符数组,所以可以说所有的操作都是对于数组的操作
那么对于一个字符序列,有哪些方法是刚需呢?
也无外乎添加元素/删除元素/更新元素/获取元素 这几种
添加有可能是插入中间或者在最后追加
我们知道,数组是顺序存储
所以对于插入这种操作必然会出现大量的元素移动情况
|
属性获取
既然是内部维护了字节数组
必然这个数组本身属性,长度 ,使用个数的获取,以及数组的扩大也有相对应的方法可以使用
length() 获取实际数据的个数
capacity() 数组的大小 所以是容量
|
|
public void setlength(int newlength) |
设置为指定长度 如果 newlength 参数小于当前长度
则长度将更改为指定的长度, 截断,数据不变
如果 newlength 参数大于或等于当前长度
则将追加有效的 null 字符 ('\u0000'),使长度满足 newlength 参数
|
public void ensurecapacity(int minimumcapacity) |
确保容量至少等于指定的最小值
如果 minimumcapacity 参数为非正数,则此方法不执行任何操作并返回
参数大于当前容量才会执行扩展
新容量的大小应大于:minimumcapacity 参数 并且大于 旧容量的两倍加 2
|
public void trimtosize() | 尝试缩减空间 如果实际使用的个数小于容量,那么进行缩减 |
添加方法
就像我们刚才说的那样,添加元素,分为尾部追加元素和中间插入元素
添加元素的方法也分为了两大阵营
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)
|
根据索引返回子串 |
public string substring(int start) | substring(int start, int end)的简化方法 指定开始位置,默认结束位置为最后 |
public charsequence subsequence(int start, int end) |
为了实现charsequence方法 内部调用的substring |
更新方法
更新方法比较少,因为是数组 数组的访问按照下标进行设置就好了 还提供了替换的功能,也算是更新操作 |
abstractstringbuilder replace(int start, int end, string
str) 使用str替换对象中从start 开始到end结束的这一段 |
删除方法
abstractstringbuilder delete(int start, int end) | 删除指定范围的char |
abstractstringbuilder deletecharat(int index) | 删除某个位置的char |
其他方法
reverse() 按照字符进行翻转 |
将此字符序列用其反转形式取代 就是翻转每一个char,注意可不是翻转比特位,也不是翻转字节,反转的是代码单元 不过对于辅助平面的字符的代码点,他们会按照字符进行翻转,也就是高代理低代理顺序不会改变 |
执行操作前未成对的低代理项和高代理项将成为代理项对 例如,反转 "\udc00\ud800" 将生成有效的代理项对 "\ud800\udc00" |
总结
如同我们上面说的,abstractstringbuilder就是 可变
字符序列的一个纲领
它规定了可变字符序列应该有的行为
比如 添加字符/删除字符/更新字符/获取字符
因为可变,所以对于可变的支持,自然是必不可少的
另外,他作为string在很多方面的一个替代,必然也是提供了string的一些功能方法
否则与string api 变化巨大 也是毫无意义
因为毕竟本身就是为了描述字符序列
所以对于abstractstringbuilder 只需要彻底理解了他作为
可变字符序列的标准接口即可
上一篇: Jedis工具类代码