天天看點

String、StringBuffer、StringBuilder和StringTokenizer

    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();
	}
	
}
           

運作結果:

String、StringBuffer、StringBuilder和StringTokenizer

從運作結果可以看出,當一個字元串需要經常被修改時,使用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());
		}
	}
}
           

運作結果:

String、StringBuffer、StringBuilder和StringTokenizer