StringBuffer 和StringBuilder 类的使用

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了,这里就不再举例详细说明了。

  1. 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。

  1. 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中的方法。

扫描二维码关注公众号,回复: 12421133 查看本文章

String是直接实现CharSequence接口的;而StringBuffer和StringBuilder类是先继承父类AbstractStringBuilder,再通过父类实现接口的。

总结

有关线程安全与否:

  • StringBuffer的线程安全
  • StringBuilder的线程不安全

效率:StringBuilder>StringBuffer>String (相对的,非绝对)

环境:

  • StringBuilder用于单线程操作大量数据;
  • String用于操作少量数据;
  • StringBuffer用于多线程操作大量数据;

猜你喜欢

转载自blog.csdn.net/qq_47610562/article/details/107162512
今日推荐