1、java.lang.StringBuffer 被 final 修饰,不能被继承。
2、StringBuffer 是线程安全的。
3、java.lang.StringBuffer 代表可变的字符序列,JDK1.0 中声明。可以对字符串内容进行增删,此时不会产生新的对象。
3、作为参数传递时,方法内部可以改变值。
4、使用时,最好使用 int 参数的构造器,防止频繁扩容影响性能。
类关系图

直接父类
AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** The value is used for character storage.*/char[] value;
实现的接口
- Serializable
- CharSequence
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
存储结构
在其父类 AbstractStringBuilder 中有 char 数组 value ,且不是 final 修饰。存放在堆中,而不是常量池中。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
构造器

StringBuffer/String转换
//String => StringBuffer
// 1、使用 StringBuffer 提供的构造器
StringBuffer buffer = new StringBuffer("123");
// 2、使用 StringBuffer 提供的 append 方法
String str = "123";
StringBuffer buffer1 = new StringBuffer();
buffer1.append(str);
//StringBuffer => String
// 1、使用 StringBuffer 提供的 toString
StringBuffer buffer = new StringBuffer("123");
String s = buffer.toString();
// 2、使用 String 的构造器
String s1 = new String(buffer);
String VS StringBuffer
1)效率
String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低。
private final char value[]; // 存放于常量池中
StringBuffer 保存的是字符串变量,里面的值可以更改,每次操作 StringBuffer 可以直接更新内容,不用更新地址(即创建新对象),效率比 String 高。
char[] value; // 存放于堆中
常用方法

public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc");
sb.append('1');
sb.append(1);
System.out.println("拼接:" + sb);
sb.delete(2, 4);
System.out.println("删除:" + sb);
sb.replace(2, 4, "hello");
System.out.println("替换:" + sb);
sb.insert(2, false);
System.out.println("插入:" + sb);
sb.reverse();
System.out.println("反转:" + sb);
System.out.println("查找:" + sb.indexOf("ba"));
System.out.println("子串:" + sb.substring(2, 8));
System.out.println("长度:" + sb.length());
System.out.println("charAt:" + sb.charAt(2));
sb.setCharAt(2,'9');
System.out.println("setCharAt:" + sb);
}
}
