StringBuffer&StringBuilder
目录
StringBuffer&StringBuilder
StringBuffer
可变的字符序列;线程安全 ,效率低;(JDK8之前的底层使用char[],之后使用byte[]数组)
StringBuilder
可变的字符序列;线程不安全 ,效率高;
源码解析
StringBuilder和StringBuffer继承了abstractStringBuilder
针对于StringBuilder来说
内部属性:
char[] value;//存储字符序列
int count;//实际存储字符的个数
StringBuilder sBuffer1 = new StringBuilder();//char[] value = new char[16];
StringBuilder sBuffer1 = new StringBuilder("abc");//char[]
value = new char[16+"abc".length];
sBuffer1.append("ac");//value[0]='a';value[1]='c';
sBuffer1.append("b");//value[2]='b';
不断的添加,一旦count要超过 value.length时,就需要扩容;默认扩容为原有容量的2倍+2。
Arrays.copyOf()将原有value数组中的元素复制到新的数组中。
使用方法
- 如果开发中需要频繁的针对字符串进行增,删,改操作,建议使用StringBuffer或者StringBuilder替换String因为使用String效率低。
- 如果开发中,不涉及到线程安全问题,建议使用StringBuilder替代StringBuffer;
- 如果开发中大体确定要操作的字符的个数,建议使用带int capacity参数的构造器。因为可以避免底层扩容操作,性能更高。
StringBuffer和StringBuilder常用方法
增:
StringBuffer append(xx)
删:
StringBuffer delete(int start,int end) [start,end)
StringBuffer deleteCharAt(int index)
改:
StringBuffer replace(int start,int end,String str)
void setCharAt(int index,char c)
查:
char charAt(int index)
插:
StringBuffer insert(int index,xx)
长度:
int length()
反转:
StringBuffer reverse()
设置底层数组长度:
setLength(int length)
new StringBuffer(int length)
对比三者的执行效率
StringBuilder > StringBuffer > String