字符串-StringBuffer、StringBuilder类

2024-03-19


都继承自AbstractStringBuilder
两个类的方法一样

常用方法

// 提供了很多的append方法,用于进行字符串追加的方式拼接,返回的是当前对象;如果append的参数为null时,将append进去"null"字符串
StringBuffer append(xx)
// 删除[start, end)之间的字符串,返回的是当前对象
StringBuffer delete(int start, int end)
// 删除[index]位置字符,返回的是当前对象
StringBuffer deleteCharAt(int index)
// 替换[start, end)范围的字符序列为str,返回的是当前对象
StringBuffer replace(int start, int end, String str)
// 替换[index]位置字符
void setCharAt(int index, char c)
// 查找指定index位置上的字符
char charAt(int index
// 在[index]位置插入xx,返回的是当前对象
StringBuffer insert(int index, xx)
// 返回存储的字符串数组的长度
int length()
// 反转,返回的是当前对象
StringBuffer reverse()

// 从前往后找当前字符串中xx,如果有返回第一次出现的下标,要是没有返回-1
int indexOf(String string)
// 返回指定字符串在此字符串中第一次出现处的索引,从指定的索引开始
int indexOf(String string, int fromIndex)
// 从后往前找当前字符串中xx,如果有返回第一次出现的下标,要是没有返回-1
int lastIndexOf(String string)
// 返回指定字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
int lastIndexOf(String str, int fromIndex)
// 返回一个新字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串
String subString(int beginInedx)
// 返回一个新字符串,它是此字符串的从beginIndex开始截取到endIdnex(不包含)的一个子字符串
String subString(int beginInedx, int endIndex)
// 返回此序列中数据的字符串表示形式
String toString()
// 设置当前字符序列长度为newLength,如果设置的长度小于当前字符串的长度,将会被从开始字符截取设置长度的字符;如果设置的长度大于当前字符串的长度,将使用0补充到设置的长度
void setLength(int newLength)

与String对比

String

不可变的字符序列
jdk8及之前底层使用char[],jdk9及之后底层使用byte[]

StringBuffer

可变的字符序列
jdk1.0声明,线程安全,效率低
jdk8及之前底层使用char[],jdk9及之后底层使用byte[]

StringBuilder

可变的字符序列
jdk5.0声明,线程不安全,效率高
jdk8及之前底层使用char[],jdk9及之后底层使用byte[]

StringBuffer、StringBuilder可变性源码分析

内部的属性

char[] value;// 存储字符序列
int count; // 实际存储的字符的个数
new时创建一个参数的长度+16的字符数组
调用append方法时将参数的值插入在value中
当append超出value的长度时,创建一个新数组,数组长度默认将value长度位扩容运算左移一位+2
如果扩容长度不够时,将长度直接设置为append后的字符长度;然后将原有value的元素复制到新数组中

使用选择

如果需要频繁针对字符串进行增删改操作,建议使用StringBuffer/StringBuilder,因为使用String效率低
不涉及线程安全问题,建议使用StringBuilder替换StringBuffer,因为StringBuilder效率高
如果大体确定要操作的字符的个数,建议使用带int capacity参数的构造器,可以避免底层多次扩容操作,性能更高


{/if}