论坛首页 Java企业应用论坛

String, StringBuffer, StringBuilder

浏览 3637 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-19   最后修改:2010-05-13
1. String 类

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

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

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

   因此String的操作都是改变赋值地址而不是改变值操作
  
   String S1 = “abc”; 
   For(int I = 0 ; I < 10000 ; I ++)
   { 
     S1 + = “def”; 
     S1 = “abc”; 
   }

   这样操作后,如果GC没有清理,内存中会产生2万个String对象
   public class test2 {

			   public static void stringReplace (String text) {    
			        text = text.replace('j' , 'i');    
			    }    
			       
			    public static void main (String args[]) {  
			    	
			     String textString = new String ("java");  
			       
			     stringReplace (textString); 
			     
			     System.out.print("textString="+textString); //输出Java
			    }    
   }

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的速度会体现出来.
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics