Java开发 之 StringBuffer和StringBuilder(1)

来源:互联网 发布:java aspectj 编辑:程序博客网 时间:2024/06/06 03:49

转 : http://www.jcourse.cn/read/234

2009-03-02 作者:
zhangtaolv

在我们日常开发中,经常会遇到对文本的操作,并且在一般的MIS系统中,文本操作尤为多,如用户名、文章内容、文章标题、合同内容等。在之前的教程中,我也给大家讲解了Java中最基本的字符串操作的类,String。在之前的教程中我也给大家讲了String是不可变的类,即在构造后其内容不能变化,因此对于内容频繁变动(如我们对文章进行编辑)来说String是不合适的。那么遇到这样的情况时,我们该如何处理呢?Java为我们提供了StringBuilder和StringBuffer。

首先讲讲它们的共同点吧!基本上我们在字符串经常发生改变的时候使用它们,然后使用它们来操作会比使用String类要快些。这两个类的区别是StringBuffer是线程安全的而StringBuilder是非线程安全的。

在大致讲解后,我们看看如何由已有的字符串对象来创建StringBuffer和将StringBuffer转换为String对象。

先给出StringBuffer类的构造方法的API,让我们看看有多少种方式来构造它。


构造方法摘要
StringBuffer() 
          
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq) 
          public java.lang.StringBuilder(CharSequence seq)
构造一个字符串缓冲区,它包含与指定的 CharSequence相同的字符。
StringBuffer(int capacity) 
          
构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str) 
          
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
 

可以看出,我们可以直接new一个,也可以在new的时候给出参数。这里的参数可以是一个字符串,可以是一个容量值,也可以是一个CharSequence。我们首先看看用已有的字符串来构造StringBuffer。下面是一个例子:

Java代码
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer aString = new StringBuffer("ABCDE");   
  5.   
  6.     String phrase = "abced";   
  7.     StringBuffer buffer = new StringBuffer(phrase);   
  8.   
  9.     System.out.println(aString);   
  10.     System.out.println(buffer);   
  11.   }   
  12. }   

上面的代码中,我们用已有的字符串对象new了两个StringBuffer对象然后我们直接将他们作为参数传递给println方法。这里我们可以看出,它们实际上输出的是StringBuffer代表的字符串。其实我们在用StringBuffer构造字符串的时候,到最后还是会调用toString方法来获取输出,从而获得我们实际要用的字符串。

好了,既然讲到了,顺便给大家一个将StringBuffer转换为字符串的例子,很简单:

Java代码
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer palindrome = new StringBuffer("so many dynamos");   
  5.   
  6.   
  7.     String aString = palindrome.toString();   
  8.   
  9.     System.out.println(aString);   
  10.   
  11.   }   
  12.   
  13. }  

看到了吧,其实我们在日常的开发中,尤其是使用StringBuffer来拼SQL的时候,经常用的就是toString方法了。

从上面的构造方法中,我们可以看到,在构造一个StringBuffer对象的时候还可以指定StringBuffer的容量,它是用int来指定的,上面的API中也可以看出,如果不指定则默认为16个字符。好了给出一个例子:

Java代码
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer newString = new StringBuffer(50);   
  5.        
  6.     System.out.println(newString.capacity());   
  7.   }   
  8. }   

上面的例子中,我们构造了一个StringBuffer对象,并给它的容量赋值为50,这样如果我们后面添加的字符少于50,那么就不会出现新扩容量的情况。上面的例子还可以看出,我们可以调用capacity来获取当前的StringBuffer对象的容量信息。下面做个例子来看看StringBuffer容量的变化情况:

Java代码
  1. /**  
  2.  * User: zhangtao  
  3.  * Date: 2009-3-2  
  4.  * Time: 16:24:36  
  5.  */  
  6. public class StringBufferDemo {   
  7.     public static void main(String[] args){   
  8.         StringBuffer sb = new StringBuffer();//默认容量为16   
  9.         System.out.println(sb.capacity());//输出16   
  10.         sb.append("123456789012345");   
  11.         System.out.println(sb.capacity());//输出16   
  12.         sb.append("6");   
  13.         System.out.println(sb.capacity());//输出16   
  14.         sb.append("789111");   
  15.         System.out.println(sb.capacity());//输出34   
  16.     }   
  17. }   

最后一个输出的依据是这样的:int newCapacity = (value.length + 1) * 2;这个是内部计算的依据,也就是在超出后,会先计算本身的容量,然后加1,再乘2,所以输出的是17*2 = 34了。有了这个公式,相信大家会知道下一个容量是多少了,没错,是70.

好了,这一讲给大家讲的有点多,先到这里,下面会详细的讲解其他方法给大家。