JAVA常用类——StringBuffer和StringBuilder概述
String StringBuffer StringBuilder的异同:
String 不可变的字符序列 底层使用char[]存储
StringBuffer 可变的字符序列 让线程安全,但效率低 底层使用char[]存储
StringBuilder 可变的字符序列 让线程不安全,但效率高 底层使用char[]存
效率对比 StringBuilder>StringBuffer >String
底层源码分析查
-
无参 String str = new String 在底层创建了一个char[],长度为0 char[] value = new char[0]
-
有参 String str = new String(“abc”) 在底层创建了一个char[]{‘a’,‘b’,‘c’}长度为3 char[] value = new char[0]{‘a’,‘b’,‘c’}
-
无参 StringBuffer sb1 = new StringBuffer 在底层创建了一个char[16],长度为16 char[] value = new char[16]
-
有参 StringBuffer sb2 = new StringBuffer(“abc”) 在底层创建了一个char[19],长度为19 char[] value = new char[“abc”.length()+16]
扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
sb1.append(‘a’); value[0] = ‘a’; 添加数据的方法
sb1.append(‘b’); value[1] = ‘b’;默认情况下扩容为原来容量的两倍再+2,同时将原有的数组复制到新的数组中
-
意义:在开发中建议使用 StringBuffer(int capacity)或StringBuilder(int capacity)构造器,可以指定底层数组容量,避免出现扩容问题
package String;
public class StringBufferBuilderTest {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
sb1.setCharAt(0,'b');
System.out.println(sb1);//bbc
String sb2 = sb1+"efg";
System.out.println(sb2);//bbcefg
StringBuffer sb3 = new StringBuffer();
System.out.println(sb3.length());//0 因为length的返回值是count 如果返回值是value长度就是16
StringBuffer sb4 = new StringBuffer("abc");
System.out.println(sb4.length());//3
}
}
常用方法
- 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() : 把当前字符序列逆转
- subString(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
总结:
增: 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()
package StringBufferBuilder;
import org.junit.Test;
/*
* 测试StringBuffer,StringBuilder的常用方法 以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() : 把当前字符序列逆转
* subString(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
*
* */
public class StringBufferBuilderMethod {
@Test
public void test1(){
StringBuffer sb1 = new StringBuffer();
//字符串拼接
sb1.append(1);
sb1.append('1');
sb1.append("abcde");
System.out.println(sb1);//11abcde
//删除指定位置的内容 左闭右开
sb1.delete(1,3);
System.out.println(sb1);//1bcde
//对指定位置进行替换 左闭右开
sb1.replace(1,3,"zz");
System.out.println(sb1);//1zzde
//在指定位置后面插入
sb1.insert(1,"ab");
System.out.println(sb1);//1abzzde
//把当前字符序列逆转
sb1.reverse();
System.out.println(sb1);//edzzba1
String sb2 = sb1.substring(1,3);
System.out.println(sb2);
sb2.toString();
System.out.println(sb2);
}
}