String类型的值一旦给定就不可以在更改(底层数组是被final修饰的),StringBuffer就是一个字符串,并且线程安全(一次只允许一个线程进入操作,保证安全牺牲效率),值是可变的字符序列(底层数组没有被final修饰)。
在创建StringBuffer时如果没有使用有参构造方法初始化时,底层数组默认程度为16;如果使用有参构造, 一种是底层数组的长度是所给字符串长度+16;另一种是直接给定长度。
添加功能public StringBuffer append(String str)
public StringBuffer insert(int offset,String str)
public StringBuffer deleteCharAt(int index)
public StringBuffer delete(int start,int end)
public StringBuffer replace(int start,int end,String str)
反转功能public StringBuffer reverse()
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("lkjh");//底层数组长度为20
System.out.println(stringBuffer);
System.out.println(stringBuffer.length());
stringBuffer.append("po");//给stringBuffer末尾加上po;
stringBuffer.insert(0,"ss");//向指定位置插入字符串;
stringBuffer.deleteCharAt(5);//删除指定位置的字符
stringBuffer.delete(6,8);//删除[6,8)区间的字符
System.out.println(stringBuffer.substring(3));//返回3之后的字符串
stringBuffer.replace(1, 3, "5555");//用指定字符串替换[1,3)位置上的字符串;
stringBuffer.reverse();//返回字符串的逆序
System.out.println(stringBuffer);
System.out.println(stringBuffer.length());//返回的是count,表示底层数组实际使用的长度
}
}
StringBuilder
与StringBuffer类似底层类似,但多线程,不安全(两个线程访问同一个资源时是不安全的)。
String,StringBuffer,StringBudiler的区别相同点:底层都是数组。
String:底层数组 char[] 被final修饰,值不可变。改变值时,实际上是创建了一个新的对象
StringBuffer:线程安全的,底层数组 char[] 没有被final修饰,字符串可变
StringBudiler:线程不安全,底层数组 char[] 没有被final修饰,字符串可变



