java中有4個類可以對字符或者字符串進行操作鲤妥,他們分別是Character佳吞、String、StringBuffer棉安、StringTokenizer,其中Character用于單個字符操作底扳,String用于字符串操作,屬于不可變類贡耽,而StringBuffer也是用于字符串的操作衷模,不同之處是StringBuffer屬于可變類鹊汛。
String是不可變類,String對象一旦被創(chuàng)建阱冶,其值將不能被改變刁憋,StringBuffer是可變類,當對象被創(chuàng)建后仍然可以對其值進行修改木蹬。如果用String 來保存一個經(jīng)常被修改的字符串時至耻,在字符串被修改時會比StringBuffer多很多附加的操作,同時生成很多無用的對象镊叁,由于這些無用的對象會被垃圾回收器來回收尘颓,因此會影響程序的性能 。
String與StringBuffer的另外一個區(qū)別在于實例化String時晦譬,可以利用構造函數(shù)(String? s1 =? new? ?String ("world"))的方式來對其進行初始化疤苹,也可以用賦值(String? s =? "Hello")的方式來初始化,而StringBuffer只能用構造函數(shù)(StringBuffer? s? =? new? ?StringBuffer("Hello"))的方式來初始化敛腌。
String字符串修改實現(xiàn)的原理如下:
當用String類型來對字符串進行修改時卧土,其實現(xiàn)方法是首先創(chuàng)建一個StringBuffer,其次調(diào)用StringBuffer的append()方法,最后調(diào)用StringBuffer
的toString()方法把結果返回像樊,事例如下:
String? ?s = "Hello";
s+ = “world” ;
以上代碼等價于下述代碼:
StringBuffer? sb? = new??StringBuffer(s);
s.append("world");
s=sb.toString();
由此可以看出尤莺,上述過程比使用StringBuffer多了一些附件的操作,同時也生成了一些臨時的對象凶硅,從而導致程序的執(zhí)行效率降低缝裁,如下示例:
public? class? Test{
pubblic? static? void testString(){
String? s? =? "hello";
String? s1 = "world";
long start? = System.currentTimeMillis();
for? (int? i? = 0 ; i<10000;i++){
s+ = s1;
}
long? end? =?System.currentTimeMillis();
long? runTime = (end -start );
System.out.println("testString:"+runTime);
}
public? static? void testStringBuffer(){
StringBuffer? s? =? new? ?StringBuffer("Hello");
String? s1 = "world";
long start? = System.currentTimeMillis();
for? (int? i? = 0 ; i<10000;i++){
s.append(s1);
}
long? end? =?System.currentTimeMillis();
long? runTime = (end -start );
System.out.println("testStringBuffer:"+runTime);
}
public static? void? main(String[] args){
?testString();
testStringBuffer()
}
}
運行結果:
從程序的運行結果可以看出,當一個字符串需要被經(jīng)常修改時足绅,使用StringBuffer要比String好的多捷绑。
StringBuilder也是被修改的字符串,它與StringBuffer類似氢妈,都是字符串緩沖區(qū)粹污,但是StringBuilder不是線程安全的,如果只是在
單線程中使用字符串緩沖區(qū)首量,那么StringBuilder的效率會更高些壮吩,當多個線程訪問時,最好使用線程安全的StringBuffer加缘。
在執(zhí)行效率方面鸭叙,StringBuilder最高,StringBuffer次之拣宏,String最低沈贝,一般而言,如果操作數(shù)據(jù)量比較小勋乾,應優(yōu)化使用String類宋下,如果在單線程操作大量數(shù)據(jù)時嗡善,優(yōu)先使用StringBuilder,如果在多線程下操作大量數(shù)據(jù)時学歧,優(yōu)先使用StringBuffer罩引。
StringTokenizer是用來分割字符串的工具類,示例如下;
? public? class? Test1{
public static? void main (String args[]){
StringTokenizer st? = new??StringTokenizer(" Welcome? to? shenyang");
? while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
}
運行結果為: