StringBuffer和StringBuilder 类(Java)
- 对字符串进行修改时,需要用到StringBuffer 以及StringBuilder 类。
- 这2个类相较于String 类的不同之处是它们的对象能被多次修改,并且不断产生新的未使用对象。
- 于Java 5提出的StringBuilder 类和StringBuffer 类的最大的不同之处在于: StringBuilder 类的方法不是线程安全的,也就是不能同步访问。
- 因为StringBuilder 相比StringBuffer 有速度优势,所以大多数情况下建议使用StringBuilder 类。但当对应用程序有线程安全要求时,就必须使用StringBuffer 类。
public class Test {
public static void main( String[]args){
StringBuffer strB=new StringBuffer("She is my");
strB.append("girlfriend,");
strB.append("I love her!");
System.out.println(strB);
}
}
以上程序运行结果为 she is my girlfriend,I love her !
StringBuffer类的主要方法:
StringBuffer类中方法主要偏重于对字符串的操作,如:追加,插入,删除等等,这也是StringBuffer类与String类的主要区别。
接下来介绍StringBuffer的几个主要方法,前面已经给出append( )方法的example了,这里就不再举例详细说明了。
- deleteCharAt()方法用来删除指定位置的字符,并将剩余字符打印出来形成新的字符。example如下:
StringBuffer strB = new StringBuffer("Jackson");
str.deleteCharAt(4);
此代码块会删除索引值为4的字符,即字符“s”。
如果想一次性删除多个字符,可以选择delete()方法。example如下:
StringBuffer str = new StringBuffer("Jackson");
str.delete(2,6);
运行结果为Jan
此代码块可删除索引值在2~6之间的字符,但注意:索引值会包括2,但不包括6。
- insert()方法可在指定位置插入字符串,比append()方法稍微高级些。example如下:
StringBuffer strB = new StringBuffer("beauti");
strB.insert(5,"ful");
运行结果为beautiful
3.setCharAt()方法可在指定位置修改字符。example如下:
StringBuffer strB = new StringBuffer("beauti");
strB.setCharAt(5,'y');
运行结果为beauty.
- 提示:以上只是API文档中的一小部分常用方法,更多详细的方法请查阅API。
下面用代码比较String和StringBuffer的执行效率:
为明显看出两者的运行效率,我们将20个字母加20000次
public class EfficiencyTest{
public static void main(String args[]){
String fragment = "aaaaaaaaaaaaaaaaaaaa";
int times=20000;
long timeToStart=System.currentTimeMiilis();
//使用String对象
String str = "";
for(int i=0;i<times;i++){
str+=fragment;
}
long timeIsOver=System.currentTimeMillis();
System.out.println("The execution efficiency of String class is "+(timeIsOver-timeToStart)+"ms");
long timeToStart1=System.currentTimeMillis();
//使用StringBuffer对象
StringBuffer str1 = new StringBuffer();
for(int i=0;i<times;i++){
str1.append(fragment);
}
long timeIsOver1=System.currentTimeMillis;
System.out.println("The execution efficiency of StringBuffer class is "+(timeIsOver-timeToStart)+"ms");
}
}
在eclipse中运行完毕很明显看得出StringBuffer效率要比String类的高得多。所以涉及大量字符串的时候非常建议大家用StringBuffer类。
String,StringBuffer和StringBuilder都实现了CharSequence接口,CharSequence是定义字符串操作的接口,它只包括length(),charAt(int index),subSequence(int start,int end)这几个API中的方法。
String是直接实现CharSequence接口的;而StringBuffer和StringBuilder类是先继承父类AbstractStringBuilder,再通过父类实现接口的。
总结
有关线程安全与否:
- StringBuffer的线程安全
- StringBuilder的线程不安全
效率:StringBuilder>StringBuffer>String (相对的,非绝对)
环境:
- StringBuilder用于单线程操作大量数据;
- String用于操作少量数据;
- StringBuffer用于多线程操作大量数据;