String, StringBuffer, StringBuilder

1. String 类 

   String 类是属于不可变类,任何对String的操作都会引起新的String对象的产生 

   String a = "a"; //假设a指向地址0x0001 

   a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。 

   因此String的操作都是改变赋值地址而不是改变值操作 
  
Java代码  收藏代码
  1. String S1 = “abc”;   
  2. For(int I = 0 ; I < 10000 ; I ++)  
  3. {   
  4.   S1 + = “def”;   
  5.   S1 = “abc”;   
  6. }  

   这样操作后,如果GC没有清理,内存中会产生2万个String对象 
Java代码  收藏代码
  1. public class test2 {  
  2.   
  3.    public static void stringReplace (String text) {      
  4.         text = text.replace('j' , 'i');      
  5.     }      
  6.          
  7.     public static void main (String args[]) {    
  8.           
  9.      String textString = new String ("java");    
  10.          
  11.      stringReplace (textString);   
  12.        
  13.      System.out.print("textString="+textString); //输出Java  
  14.     }      
  15. }  

2. StringBuffer是不可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 

   StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区 

   StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区 

   StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区 

   setCharAt 
   charAt 
   insert 
   append//添加字符串或者char型数组 
   setLength 小于长度,会截断字符串 
   substring 
   replace 
   reverse 反转 
   public void getChars(int srcBegin,//字符串中要复制的第一个字符的索引。 
                     int srcEnd,//字符串中要复制的最后一个字符之后的索引 
                     char[] dst,//目标数组 
                     int dstBegin)//目标数组中的起始偏移量 

3. 从 JDK 5.0 开始,为StringBuffer类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 

StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 

String StringBuffer StringBuilder 对比 
1.jdk版本支持 
StringBuilder JDK1.5以后版本支持 
2.线程安全 
StringBuffer 线程安全 
StringBuilder 线程不安全 
Java.lang.StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发 生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。 
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量 自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。 
3.速度 

一般情况下,速度从快到慢:StringBuilder>StringBuffer>String.当需要在循环中多次使用字符串拼接时,建 议使用StringBuilder或StringBuffer.当数量级在百万级(这里可能不准确)时,StringBuilder的速度会体现出来.


原文地址:http://www.iteye.com/topic/411571

posted @ 2011-08-11 18:33  petercao  阅读(393)  评论(0编辑  收藏  举报