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

类关系图

image.png

直接父类

AbstractStringBuilder

  1. abstract class AbstractStringBuilder implements Appendable, CharSequence {
  2. /**
  3. * The value is used for character storage.
  4. */
  5. 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;

构造器

image.png

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; // 存放于堆中

常用方法

image.png

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);
    }
}