1.StringBuffer
1)StringBuffer:线程不安全,也是对字符串的操作,位于java.lang包中,其底层也是字符数组,初始化长度是16;但是它在String类的基础上有了很大的改进,最大的特点就是String是不可变。的,StringBuffer是可变化的。
2)常用方法
增加:
在字符串后附加,参数可以是任意基本数据类型,boolean会被转为"true"或者"false"等
public StringBuffer append(Object obj);
public StringBuffer append(String str);
public StringBuffer append(double d) ;
在指定位置后增加字符串,参数可以是任意基本数据类型,boolean会被转为"true"或者"false"等
public StringBuffer insert(int offset, boolean b);
public StringBuffer insert(String str);
public StringBuffer insert(double d) ;
删除:
public StringBuffer deleteCharAt(int index) :删除指定位置的字符
public StringBuffer delete(int start, int end):删除指定位置到指定位置的字符串
修改:
public StringBuffer replace(int start, int end, String str):将指定位置的字符串(start到end位置的)替换为str
反转:
public synchronized StringBuffer reverse() :将字符串反转返回。
3)String与StringBuffer:
<1>String是字符串常量,是不变的,在改动String时候实际上是又新建了一个String对象;而StringBuffer是可变的,在改动的时候是先保存了原先对象的地址,然后将改动后的对象放在原地址上的。
//以对字符串的增加为例
String s1 = "ad";
System.out.println(s1.hashCode());//3107
s1+="sd";
System.out.println(s1.hashCode());//2989492
StringBuffer sb2 = new StringBuffer("ss");
System.out.println(sb2.hashCode());//460141958
sb2.append("as");
System.out.println(sb2.hashCode());//460141958
从结果上可以发现,String的地址发生了改变,StringBuffer的地址没有发生改变。
<2>在使用字符串进行增删改查操作时候,由于String将会新建对象后然后引用,这样大大影响了性能,而StringBuffer是在原来的对象上修改的所以不存在这样的影响。当数据量巨大时候,String将会造成大量的对象的创建,而StringBuffer则是始终只有一个对象。
String s1 = "sadfge";
String str1 = new String("sadgfe");
StringBuffer sb1 = new StringBuffer("sadfge");
long a1 = System.currentTimeMillis();
for(int i = 0;i<10000;i++){
s1+="sadfge";
}
long a2 = System.currentTimeMillis();
System.out.println(a2-a1);//501
long a3 = System.currentTimeMillis();
for(int i = 0;i<10000;i++){
sb1.append("sadfge");
}
long a4 = System.currentTimeMillis();
System.out.println(a4-a3);//0
从结果上可以看到在处理大数据量时候的明显差距。
2.StringBuilder
StringBuilder是5.0新增的,是线程不安全的,其大部分方法与StringBuffer是一致的。
3.总结
1)对于数据量小的使用String;
2)数据量大且要求线程安全的使用StringBuffer;
3)数据量大且并无线程安全要求的使用StringBuilder。