写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
1. StringBuffer
张小飞:StringBuffer——是什么东西?
诸小亮:这是字符串缓冲区,其实就是一个字符容器
张小飞:。。。。。。,说人话
诸小亮:你可以这样认为,它是可变字符串
1. 介绍
张小飞:之前不是说,字符串不可变吗?
诸小亮:那是 String,现在是 StringBuffer,它的主要特点:
- 长度可以变化
- 通过指定方法可以修改内容
示例:
public static void main(String[] args) throws Exception {
//1. 创建对象
StringBuffer str = new StringBuffer();
//2. 添加内容,append 可以多次调用,而且执行 append 跟字符串常量池没关系
str.append("a").append(2).append('c').append(3.14);
//3. 转换为字符串
System.out.println(str.toString());
}
结果:
张小飞:注释上说‘append 跟字符串常量池没关系’是什么意思?
诸小亮:就是执行 append 方法后,并不会在字符串常量池中添加字符串
张小飞:哦,原来是这个意思,那什么时候才会有字符串呢?
诸小亮:调用 toString 后,才会真正的把 StringBuffer 转换为一个 String
注意:在执行 System.out.println(str.toString()); 之前,常量池中是没有a2c3.14这个字符串的
2. 常用方法
诸小亮:来看一下它都有哪些常用的方法
1. append
append:尾部追加内容,参数可以是各种类型的数据,比如:
2. insert
insert:在指定位置插入内容
结果:
可以认为是在第 n 个字符后插入内容
3. delete
delete:删除指定范围内的子串
结果:,包含头下标0,不包含尾下标2
4. deleteCharAt
deleteCharAt:删除指定位置上的字符
结果:
5. replace
replace:替换指定范围的子串
结果:
6. reverse
reverse:反转
结果:
7. charAt
charAt:返回指定位置的字符
结果:
3. 原理
张小飞:StringBuffer 具体是如何让 ‘字符串可以变化’的呢?
诸小亮:StringBuffer 对象中维护了一个可变数组,在执行 append 方法时只是往数组中添加内容,所以。。。
张小飞:可变数组?数组的长度也可以改变?
诸小亮:数组的长度不可变,‘可变数组’就是创建一个新的数组,把老的内容复制过来,再加上新的内容
张小飞:原来如此
诸小亮:所以,StringBuffer 让字符串可变的原理大概是这样的
诸小亮:在调用 toString() 方法时,就把 数组中的内容转换为字符串