StringBuilder和StringBuffer.
1、String、StringBuilder、StringBuffer三者的异同?.
不同
String:JDK1.0 不可变的字符序列
StringBuilder:JDK1.0 可变的字符序列:线程安全的,效率偏低
StringBuffer:JDK1.5 可变的字符序列:线程不安全,效率高
相同
JDK1.8及以前,底层都是使用char[]存储
JDK1.9及以后,底层都是使用byte[]存储
2、底层中.
new StringBuilder();// 底层new了一个容量为16的char或byte数组
new StringBuilder("ab");// 底层new了一个容量为"ab".length() + 16的char或byte数组
3、涉及问题.
1.长度.
StringBuilder sb = new StringBuilder();
//问sb的长度
System.out.println(sb.length());// 0
@Override
public int length() {
return count;// 返回的是一个计数器,并不是value.length
}

2.扩容问题.
如果底层数组装不下,默认扩容为原来的2倍+2,同时将原有数组中的元素复制到性的数组中
4、常用方法(以StringBuffer为例).
StringBuffer append(XXX)在字符串末尾添加XXX
StringBuffer delete(int start, int end)删除指定位置的内容
StringBuffer replace(int start, int end, String str)替换指定位置的内容
StringBuffer insert(int offset, XXX)在指定位置插入XXX
StringBuffer reverse()字符串序列反转
int indexOf(String str)
String substring(int start, int end)
int length()
int charAt(int n)
void setCharAt(int n, char ch)设置指定索引的字符
StringBuilder与StringBuffer相同
5、效率比较(拼接操作).
StringBuilder > StringBuffer > String

public class MyTest{
public static void main(String[] args) {
new CalcTime("String"){
String s = new String();
@Override
public void code() {
for (int i=1;i < 30000; i++){
s += i;
}
}
}.test();
new CalcTime("StringBuilder"){
StringBuilder sbd = new StringBuilder();
@Override
public void code() {
for (int i=1;i < 30000; i++){
sbd.append(i);
}
}
}.test();
new CalcTime("StringBuffer"){
StringBuffer sbf = new StringBuffer();
@Override
public void code() {
for (int i=1;i < 30000; i++){
sbf.append(i);
}
}
}.test();
}
}
abstract class CalcTime{
private String name;
public void test(){
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println(this.name +"耗时" + (end - start) + "ms");
}
public CalcTime(String name){
this.name = name;
}
public abstract void code();
}