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,比如配置信息等
转载自:https://juejin.cn/post/7245145215798378555