一、StringBuffer:
1. 是可变长的,内容可以直接增删,是一个容器,存放字符数组的位置在父类AbstructStringBuilder的char[] value中,与String不同,该数组不是final的,是存放在堆中的,如果想要继续添加字符,在不超过原本数组长度的情况下,可以直接追加。
而String每次更改都要重新创建对象,更改string变量指向的地址值,因为其字符数组保存的地址值是final不可更改的,所以每次只能重新创建string对象。
2. StringBuffer类是final的,不能被继承。
3. 构造器:
(1)new StringBuffer():默认传入16,16为value的默认大小
(2)new StringBuffer(int capacity):给定value的大小
(3)new StringBuffer(String str):底层调用 super(str.length()+16); append(str);
(4)new StringBuffer(CharSequence seq):传入字符序列,不常用
4. String和StringBuffer的互相转换:
(1)String——>StringBuffer:
(1.1)new StringBuffer(String str)
(1.2)StringBuffer sb = new StringBuffer(); sb.append(str);
(2)StringBuffer——>String:
(2.1)new String(stringbuffer);
(2.2)stringbuffer.toString();
5. 常用方法:
(1)append():里面可以传字符、字符串、数字、布尔等,都可以转为字符类型添加进去
(2)toString():底层是
if (toStringCache == null) {//这里的toStringCache是被transient修饰的不能被序列化的私有属性 toStringCache = Arrays.copyOfRange(value, 0, count);//现将value复制 } return new String(toStringCache, true);//重新new一个string对象
(3)delete(start,end):删除StringBuffer对象的 [start,end)的部分
(4)replace(start,end,str):将[start,end)部分替换为str
(5)indexOf(str):str在StringBuffer中的首次出现位置
(6)insert(index,str):在index位置插入str,原来该位置上的字符向后推移
(7)length()
6. 练习:
(1)底层调用父类的append方法
if (str == null) return appendNull();
其中
private AbstractStringBuilder appendNull() { int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = 'n'; value[c++] = 'u'; value[c++] = 'l'; value[c++] = 'l'; count = c; return this; }
可以看出,添加的字符串是null的话,也会追加“null”
(2)会调用length(),因此会有空指针异常
public StringBuffer(String str) { super(str.length() + 16); append(str); }
(3)简单应用insert:给小数点前面的数每三个一组加上“,”
public static void main(String[] args) {
//给字符串加上逗号分隔其代表的数字
String s = "31231.23";
StringBuffer sb = new StringBuffer(s);
for(int i = sb.lastIndexOf(".")-3;i>0;i-=3){//先往前挪三位再判断
sb.insert(i,",");
}
sb.length();
String str = null;
sb.append(str);
System.out.println(sb.toString());
}
1. 两者的父类都是AbstructStringBuilder,二者的方法都是相同的,只是线程安全性不同。
二、StringBuilder:
1. 其与StringBuffer的区别是不是线程安全的,用在字符串缓冲区被单个线程使用的时候,因为他没有synchronize互斥
2. 在单线程情况下比StringBuffer快,是其一个简易替换
3. 其父类和StringBuffer一致,都是AbstructStringBuilder。
三、效率上 StringBuilder > StringBuffer > String
四、小结