开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
概述
StringBuffer类是代表可变的字符序列。可以对字符串内容进行增删,此时不会产生新的对象。
String、StringBuffer和StringBuilder
Q:String、StringBuffer和StringBuilder的异同
- String:不可变的字符序列;底层使用char[]存储
- StringBuffer:可变的字符序列;线程安全但效率低;底层使用char[]存储
- StringBuilder:可变的字符序列;JDK5.0新增,线程不安全但效率高;底层使用char[]存储
🎈效率比较:
从高到低排列:StringBuilder > StringBuffer > String
@Test
public void test(){
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}
StringBuffer源码分析
创建
当new一个StringBuffer的对象时(空参时),底层创建了一个长度为16的字符数组char[] value。 但是如果没往这个数组里加东西,我们输出“对象.length()”的时候依然是0。
另外的:创建对象不用空参,比如
StringBuffer sb1 = new StringBuffer("abc");
相当于底层创建了长度为: "abc".length() + 16长度的字符数组
扩容
当底层数组容量不够时,则原容量* 2+2作为新数组的长度。并将原有数组中的元素复制到新数组中。
StringBuffer的常用方法
-
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
-
StringBuffer delete(int start,int end):删除指定位置的内容
-
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
-
StringBuffer insert(int offset, xxx):在指定位置插入xxx
-
StringBuffer reverse() :把当前字符序列逆转
-
public int indexOf(String str):返回首次出现位置
-
public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
-
public int length()
-
public char charAt(int n )
-
public void setCharAt(int n ,char ch):将指定位置的字符改成新的
@Test
public void test(){
StringBuffer s1 = new StringBuffer("abc");
s1.append(1); //看成字符串的拼接
s1.append('1');
System.out.println(s1);
s1.delete(2,4); //左闭右开,删除索引为2,3元素
s1.replace(2,4,"hello"); //左闭右开,将索引2到3的元素替换成 hello这个新字符串
s1.insert(2,false); //在索引2的位置元素前插入
s1.reverse(); //逆转当前字符串
String s2 = s1.substring(1, 3); //从索引1到2的元素切下来给s2
System.out.println(s1);
System.out.println(s1.length());
System.out.println(s2);
}
总结:
- 增:append(xxx)
- 删:delete(int start,int end)
- 改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
- 查:charAt(int n )
- 插:insert(int offset, xxx)
- 长度:length();
- 遍历:for() + charAt() / toString()