Java語言有4個類可以對字元或者字元串進行操作,分别是:Character、String、StringBuffer和StringTokenizer,其中Character用于單個字元的操作,String用于字元串操作,屬于不可變類,而StringBuffer也是用于字元串操作的,不同之處在于StringBuffer屬于可變類。
一、String和StringBuffer的比較
差別:
1、String是不可變類,一旦被建立,其值将不能被修改,而StringBuffer是可變類,當對象被建立後仍然可以對其值進行修改。由于String是不可變類,是以适合在需要被共享的場合中使用,而當一個字元串經常需要被修改時,最好使用StringBuffer來實作;
2、String在執行個體化String時有兩種方式,可以利用構造函數:String s = new String("Hello")的方式對其進行初始化,也可以用指派:String s = "Hello"的方式來初始化,而StringBuffer隻能使用構造函數StringBuffer s = new StringBuffer("Hello")的方式類初始化。
String和StringBuffer修改字元串效率對比:
package dayTest;
public class Test {
/*
* 比較String和StringBuffer對字元串進行修改的效率:
* String:是不可變類,一旦被建立後,其值将不能再被修改
* StringBuffer:是可變類,當對象被建立後仍可以修改
*/
//String
public static void testString(){
String s = "Hello";
String s1 = "World";
long start = System.currentTimeMillis();
for(int i = 0; i<1000; i++){
s+=s1;
}
long end = System.currentTimeMillis();
long runTime = (end - start);
System.out.println("testString:" + runTime);
}
//StringBuffer
public static void testStringBuffer(){
StringBuffer s = new StringBuffer("Hello");
String s1 = "World";
long start = System.currentTimeMillis();
for(int i = 0; i<1000; 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();
}
}
運作結果:
從運作結果可以看出,當一個字元串需要經常被修改時,使用StringBuffer比使用String要快的多。
其實String字元串的修改原理是:當使用String類型對字元串進行修改時,首先會建立一個StringBuffer,然後再調用StringBuffer的append( )方法,最後再調用StringBuffer的toString( )方法把結果傳回。
例如:
String s = "Hello";
s+="World";
等價于:
StringBuffer s1 = new StringBuffer(s);
s.append("World");
s = s1.toString();
由上述過程可以看出來String對字元串進行修改比StringBuffer對字元串進行修改要多很多附加的操作,同時還生成了很多臨時對象,進而導緻程式的執行效率降低。
二、StringBuffer和StringBuilder的比較
StringBuilder也是可以被修改的字元串,與StringBuffer類似,都是字元串緩沖區,但StringBuilder不是線程安全的,如果隻是在單線程中使用字元串緩沖區,那麼StringBuilder的效率會更高些。是以在隻有單線程通路時可以使用StringBuilder,當有多個線程通路時,最好使用線程安全的StringBuffer。
在執行效率方面:StringBuilder > StringBuffer > String,是以如果要操作的資料量比較小的時候,應該應該優先使用String類;如果在單線程下操作大量資料時,應該優先使用StringBuffer類;如果在多線程下操作大量資料時,應該優先考慮使用StringBuffer類。
三、StringTokenizer工具類
StringTokenizer是用來分割字元串的工具類,下面給出一個例子:
package stringTest;
import java.util.StringTokenizer;
public class Test1 {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("Good Good Study Day Day Up");
while(st.hasMoreTokens()){
System.out.println(st.nextToken());
}
}
}
運作結果: