[toc]
### 一、可变字符串
String一旦被创建,值是不能改变,如果参与了操作,引用发生了变化,不是在原有的字符串上操作的,而是产生了一个<b>新的字符串</b>.
StringBuffer创建后值可以发生改变(增删改),但地址不会发生变化。
![](https://img.kancloud.cn/f8/56/f856fb7f04896587f2555f871b4b7aca_540x238.png)
### 二、StringBuffer内部实现
StringBuffer的内部实现采用数组,默认数组长度为16。
![](https://img.kancloud.cn/f0/40/f0409257d774e7fe01fe9aba7a3747e0_857x216.png)
### 三、常用API
#### append
添加字符串
![](https://img.kancloud.cn/72/13/721363f754b04367921b21201f36e821_899x194.png)
#### insert
指定位置插入字符串
![](https://img.kancloud.cn/66/83/66836d2b98379f552ab4de2d75e07a3b_866x187.png)
#### delete
![](https://img.kancloud.cn/65/c2/65c2b8d7254df6d5918c491eaa40ba2b_912x96.png)
#### indexof
![](https://img.kancloud.cn/8a/c2/8ac24e623f1d718085cd28257fabe492_909x93.png)
### 四、String、StringBuffer和StringBuilder异同点
1.都是<b>final类</b>,都不允许被继承;
2.String长度是不可变的,StringBuffer和StringBuilder长度是可变的;
3.StringBuffer是线程安全的,StringBuilder不是线程安全的。
4.String类重写了equals方法,StringBuilder和StringBuffer没有equals方法,故用的是父类Object的equals方法。