2022-5-18_java
StringBuffer类
可变的字符序列, 可以对字符串内容增删.
直接父类是AbstractStringBuilder
, 实现了Serializable
AbstractStringBuilder
中有char
数组而且不是final
类型, 存字符串内容, 存放在堆中
StringBuffer
是一个final
类, 不能被继承
String
保存字符串常量, 里面的值不能更改, 每次String
类更新实际上是改地址StringBuffer
保存字符串变量, 可以改值, 效率较高.
StringBuffer的构造器
默认分配16个空间
StringBuffer()
放入一个字符串
也可以指定char[]
的大小
String和StringBuffer相互转换
StringBuffer stringBuffer = new StringBuffer(str);
对str
本身无影响
stringBuffer.append(str);
先建空Buffer
后添加也可以
StringBuffer
的toSting
方法也可以
StringBuffer 常用的方法
- 增加 append
- 删除 delete(start, end)
- 改 replace(start, end, string) 被修改的不包含end
- 查 indexOf()
- 插入 insert(index) 原来index位置自动后移
- 获取长度 length
Exercise
分析需要看源码
StringBuilder结构分析
- 可变字符序列, 提供与StringBuffer兼容的API, 但不保证同步, 被设计为StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用时.
- StringBuilder上的主要操作是append和insert, 可重载.
结构图和StringBuffer几乎一致
StringBuilder常用方法
解读:
- 继承了AbstractStringBuilder类
- 实现了Serializable接口
- 是一个final类, 不能被继承
- 对象的字符序列, 还是存放在AbstractStringBuilder中的
char[] value
中, 数据还是放在堆中的 - StringBuffer没有做互斥操作, 即没有synchronized关键字.
String, StringBuilder和StringBuffer的比较
- String不可变字符序列, 效率低, 但复用率高
- StringBuffer中有
synchronized
已同步 - StringBuilder 可变字符序列, 效率最高, 线程不安全
- String使用注意说明, 如果需要对String做大量修改, 不要使用String
结论
- 如果字符串存在大量的修改操作, 一般使用StringBuffer或StringBuilder
- 如果字符串存在大量的修改操作, 并存在多线程的情况, 使用StringBuffer
- 如果字符串存在大量的修改操作, 并存在多线程的情况, 使用StringBuffer