为什么要使用可变字符串

String类是保存字符串常量的。每次修改都需要重新开辟空间,效率低

StringBuffer的特点

  1. StringBuffer 的直接父类 是 AbstractStringBuilder (是一个古老的可变字符串类)r
    2. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化 (用于网络传输)
    3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final(可变)
    该 value 数组存放 字符串内容,存放在堆中的
    4. StringBuffer 是一个 final 类,不能被继承
    5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
    不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
    只有在value数组长度不够时才会创建一个新的数组

    StringBuffer使用

    1. StringBuffer name = new StringBuffer("ll");
    2. name.append("dwb");
             String str = new String(name);
             str = name.toString();
    
    | 方法名 | 描述 | 传值 | 语法 | | —- | —- | —- | —- | | append | 增加 | 基本数据类型(包括String) | append(i值) | | delete | 删除 | int | delete(开始索引,结束索引) | | replace | 替换指定位置的值 | String | replace(开始索引,结束索引,值); | | indexOf | 查找指定的子串在字符串第一次出现的索引,如果找不到返回-1 | String | indexOf(值) | | insert | 在索引为 9 的位置插入 “赵敏”,原来索引为 9 的内容自动后移 | String | insert(索引,值) | | length | 返回StringBuffer的长度 | 无 | length() |

查看StringBuffer的源码

image.pngimage.png

通过看源码 发现我们调用无参的构造器的时候 底层默认创建了大小为16的byte数组