文章目录
StringBuffer
StringBuffer 继承了 AbstractStringBuilder,所以底层是 char[] value。它是可变的数组,。而且放在堆区,
StringBuilder触发扩容机制时,其内部字符数组的地址会改变,但StringBuilder对象的地址本身不会改变。
创建 StringBuffer
//1. 创建一个 大小为 16 的 char[], 用于存放字符内容
StringBuffer stringbuffer = new StringBuffer();
//2. 通过构造器指定 char[] 大小
StringBuffer stringbuffer1 = new StringBuffer(100);
//3. 通过 给一个String 创建 StringBuffer , char[] 大小就是 str.length() + 16,可以用 capacity方法证明
StringBuffer hello = new StringBuffer("hello");
String 与 StringBuffer 互相转换
- String 转 StringBuffer
//第一种方法:构造器
String str = "hello tom";
StringBuffer stringBuffer = new StringBuffer(str);
//第二种方法:append 方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
- StringBuffer 转 String
//第一种方法:使用 toString 方法
StringBuffer stringBuffer = new StringBuffer("chicken");
String s = stringBuffer.toString();
//第二种方法: 使用String 构造器
String s1 = new String(stringBuffer);
StringBuffer常用方法
- 追加
StringBuffer stringBuffer = new StringBuffer("hello");
stringBuffer.append("fuck").append("world");
System.out.println(stringBuffer);
- 删除
StringBuffer stringBuffer = new StringBuffer("hello");
stringBuffer.delete(1, 3); //左闭右开 [1,3) 这里删掉 el
System.out.println(stringBuffer);
- 替换
StringBuffer stringBuffer = new StringBuffer("fuck world!");
stringBuffer.replace(0,5, "hello "); //左闭右开
System.out.println(stringBuffer);
- 查找
StringBuffer stringBuffer = new StringBuffer("fuck world!")
int index = stringBuffer.indexOf("fuck");
System.out.println(index);//和String规则一样,返回0
- 插入
StringBuffer stringBuffer = new StringBuffer("man");
stringBuffer.insert(0, "damn ");
System.out.println(stringBuffer);
String 为 NULL 转 StringBuffer 问题
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());//输出为 4
append 底层又遇到 NULL 会转成 空字符 “NULL”;
扩容机制
- StringBuilder 默认初始化容量16,构造参数为 String 默认为 String 的
长度 + 16
- StringBuilder 扩容策略:默认从当前容量开始,每次扩为原来的 2 倍再加上 2。如果要扩容的量大于原来的 2 倍再加上 2,那就直接按照这个值扩容 比如:你数组长度 40,默认value数组为 16,按照初始策略 16 * 2 + 1 = 34 ,不够扩,那就直接扩成 40
StringBuilder 类
StringBuilder 东西和 StringBuffer 一样的。知识 StringBuilder 效率高,但是线程不安全。没啥好讲的所以直接跳到 三个 String 的比较
String - StringBuilder - StringBuffer 比较
;
String:字符序列不可变,效率最低,因为共享原则,复用率高
StringBuffer:字符序列可变,效率三者中第二,线程是安全的
StingBuilder:字符序列可变,效率最高,线程不安全
使用建议
- 如果字符串要大量修改,单线程用 StringBuilder, 多线程用 StringBuffer
- 如果字符串很少修改,被多个对象引用,可以使用 String
常用方法
append(Type data)
: 将指定类型的数据追加到此字符串缓冲区的末尾。
delete(int start, int end)
: 删除此字符串缓冲区中的部分字符,从start
索引开始到end
索引之前。
deleteCharAt(int index)
: 删除此字符串缓冲区在指定索引处的字符。
insert(int offset, String str)
: 在此字符串缓冲区的指定位置插入字符串。
replace(int start, int end, String str)
: 使用给定的字符串替换此字符串缓冲区中的一个子字符串,从start
索引开始到end
索引之前。
reverse()
: 反转此字符串缓冲区的字符序列。
setCharAt(int index, char ch)
: 使用指定字符替换此字符串缓冲区在指定索引处的字符。
setLength(int newLength)
: 设置此字符串缓冲区的长度。如果新长度大于当前长度,则用null字符(‘\0’)填充;如果小于当前长度,则截断字符串。
charAt(int index)
: 返回此字符串缓冲区在指定索引处的字符。
indexOf(String str)
: 返回指定子字符串在此字符串缓冲区中第一次出现的位置。
indexOf(String str, int fromIndex)
: 从指定的索引开始,返回指定子字符串在此字符串缓冲区中第一次出现的位置。
lastIndexOf(String str)
: 返回指定子字符串在此字符串缓冲区中最后一次出现的位置。
lastIndexOf(String str, int fromIndex)
: 从指定的索引开始,返回指定子字符串在此字符串缓冲区中最后一次出现的位置。
length()
: 返回此字符串缓冲区的长度。
substring(int start)
: 返回一个新的字符串,它是此字符串缓冲区的一个子字符串,从指定的start
索引开始直到字符串的末尾。
substring(int start, int end)
: 返回一个新的字符串,它是此字符串缓冲区的一个子字符串,从指定的start
索引开始到end
索引之前。
toString()
: 返回此字符串缓冲区的字符串表示形式。