likes
comments
collection
share

StringBuffer、StringBuilder底层扩容机制与常用方法

作者站长头像
站长
· 阅读数 11

StringBuffer 与 StringBuilder底层分析、扩容机制与常用方法

StringBuffer(线性安全)

  1. 直接父类AbstractStringBuilder
  2. 实现了Serializable,可以串行化
  3. 在父类AbstractStringBuilder有属性char[] value 不是final类型,该value数字存放字符串内容,引出存放在堆中,所以在变化的时候不用每次都更改地址,创建新的对象,效率高
  4. 是一个final类,不能被继承

StringBuffer构造方法

  1. StringBuffer()初始容量为16
  2. StringBuffer(int capacity) 初始容量为指定大小
  3. StringBuffer(String str) 初始容量为指定字符串+16,注意是容量不是长度

StringBuffer扩容 (StringBuilder扩容机制一样)

扩容方式:2n+2

源码:

private int newCapacity(int minCapacity) {
        // overflow-conscious code
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
            newCapacity = minCapacity;
        }
        return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
    }

StringBuffer、StringBuilder的类继承结构图,两者的结构图是一样的

StringBuffer、StringBuilder底层扩容机制与常用方法

StringBuffer常用方法

  1. 增 append
  2. 删 delete(start,end)
  3. 改 replace (start,end,string) ,string是要修改成的新内容
  4. 查 indexOf(string) , string是要 查找的内容
  5. 插入 insert
  6. 获取长度 length() 注意有括号

StringBuilder (不安全)

  • 线程不安全,单线程优先使用,方法中没有synchronized修饰
  • 主要操作时append和insert,可以重载这些方法,可以接受任何类型的数据
  • 扩容机制与StringBuffer一样

String、StringBuffer、StringBuilder三者之间的区别

  1. StringBuffer、StringBuilder 均代表可变字符串,方法一样
  2. String:不可变字符序列,效率低,但是复用率高
  3. StringBuffer:可变字符串、增删效率高,线性安全
  4. StringBuilder:可变字符串、增删效率高,线性不安全

使用场景

1.如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder

2 . 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder

3.如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer

4.如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等