javaAPI(二)——String、StringBuffer、StringBuilder

String、StringBuffer、StringBuilder的异同?

String:不可变字符序列;底层结构使用char[]存储;
StringBuffer:可变字符序列;线程安全的,效率低;底层结构使用char[]存储;
StringBuilder:可变字符序列;JDK5.0新增的,线程不安全,效率高。底层结构使用char[]存储;

StringBuffer源码分析

String

String str = new String();//char[] value = new char[0]
String str1 = new String(“abc”);//char[] value = new char[]{‘a’,‘b’,‘c’}

StringBuffer

StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];//底层创建了一个长度为16的数组
StringBuffer sb2 = new StringBuffer(“abc”);//char[] value = new char[“abc”.length()+16];

StringBuffer部分源码
javaAPI(二)——String、StringBuffer、StringBuilder
StringBuilder部分源码
javaAPI(二)——String、StringBuffer、StringBuilder
StringBuffer和StringBuilder继承了共同的父类
两者的区别是StringBuffer的方法是线程安全的,StringBuilder线程不安全。

StringBuffer的扩容问题

如果要添加的数据底层数组盛不下了,那就需要扩容底层数组

默认情况下:扩容为原来的2倍+2,同时将原有数组中的元素复制到新的数组中

javaAPI(二)——String、StringBuffer、StringBuilder

建议使用:StringBuffer(int capacity)构造器:capacity为底层数组的长度。能够避免扩容,提高效率。

StringBuffer的常用方法

StringBuffer append(xxx) 提供了很多append(),用于字符串拼接
StringBuffer delete(int start ,int end) 删除指定位置的内容
StringBuffer replace(int start,int end,String str) 把[start,end)位置替换为str
StringBuffer insert(int offset,xxx) 指定位置插入xxx
StringBuffer reverse() 把当前字符序列逆转
public int indexOf(String str)
public String substring 返回一个从start开始到end所用结束的子字符串
pubic int length()
public char charAt(int n)
public void setCharAt(int n,char ch)

String、StringBuffer、StringBuilder效率对比

在频繁插入字符时,
StringBuilder>StringBuffer>String
其中String效率要远远低于二者。