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

 更新时间:2023年07月05日 10:28:15   作者:指挥官乄  
这篇文章主要给大家介绍了StringBuffer、StringBuilder底层扩容机制与常用方法,有感兴趣的小伙伴跟着小编一起来学习吧

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

StringBuffer(线性安全)

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

StringBuffer构造方法

  • StringBuffer()初始容量为16
  • StringBuffer(int capacity) 初始容量为指定大小
  • 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常用方法

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

StringBuilder (不安全)

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

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

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

使用场景

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

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

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

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

到此这篇关于StringBuffer与StringBuilder底层扩容机制与常用方法的文章就介绍到这了,更多相关StringBuffer与StringBuilder扩容与用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论