1. String 類
String的值是不可變的,這就導致每次對String的操作都會產生新的String對象,不僅效率低下,而且大量浪費有限的記憶體空間。
String a = "a"; //假設a指向地址0x0001
a = "b";//重新賦值後a指向地址0x0002,但0x0001地址中儲存的"a"依舊存在,但已經不再是a所指向的,a 已經指向了其它地址。
因此String的操作都是改變賦值地址而不是改變值操作。
2. StringBuffer是可變類,和安全執行緒的字串操作類,任何對它指向的字串的操作都不會產生新的對象。 每個StringBuffer對象都有一定的緩衝區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量。
StringBuffer buf=new StringBuffer(); //分配長16位元組的字元緩衝區
StringBuffer buf=new StringBuffer(512); //分配長512位元組的字元緩衝區
StringBuffer buf=new StringBuffer("this is a test")//在緩衝區中存放了字串,並在後面預留了16位元組的空緩衝區。
3.StringBuffer
StringBuffer和StringBuilder類功能基本相似,主要區別在於StringBuffer類的方法是多線程、安全的,而StringBuilder不是安全執行緒的,相比而言,StringBuilder類會略微快一點。對於經常要改變值的字串應該使用StringBuffer和StringBuilder類。
4.安全執行緒
StringBuffer 安全執行緒
StringBuilder 線程不安全
5.速度
一般情況下,速度從快到慢:StringBuilder>StringBuffer>String,這種比較是相對的,不是絕對的。
6.總結
(1).如果要操作少量的資料用 = String
(2).單線程操作字串緩衝區 下操作大量資料 = StringBuilder
(3).多線程操作字串緩衝區 下操作大量資料 = StringBuffer
以下是代碼與示範說明:
複製代碼 代碼如下:public class TestCharacter {
final static int time = 50000; //迴圈次數
public TestCharacter(){
}
public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s += “add”;
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”類型使用的時間為:”+(over-begin)+”毫秒”);
}
public void test(StringBuffer s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getCanonicalName()+”類型使用的時間為:”+(over-begin)+”毫秒”);
}
public void test(StringBuilder s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s.append(“add”);
}
long over = System.currentTimeMillis();
System.out.println(“操作”+s.getClass().getName()+”類型使用的時間為:”+(over-begin)+”毫秒”);
}
/*對 String 直接進行字串拼接的測試*/
public void test2(){
String s2 = “abcd”;
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
String s = s2 + s2 +s2;
}
long over = System.currentTimeMillis();
System.out.println(“操作字串對象引用相加類型使用的時間為:”+(over-begin)+”毫秒”);
}
public void test3(){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
String s =”abcd” + “abcd” + “abcd”;
}
long over = System.currentTimeMillis();
System.out.println(“操作字串相加使用的時間為:”+(over-begin)+”毫秒”);
}
public static void main(String[] args){
String s1 = “abcd”;
StringBuffer st1 = new StringBuffer(“abcd”);
StringBuilder st2 = new StringBuilder(“abcd”);
TestCharacter tc = new TestCharacter();
tc.test(s1);
tc.test(st1);
tc.test(st2);
tc.test2();
tc.test3();
}
}
我在myeclipse和dos下都運行了這段代碼,各自列印出的時間有些不同,運行結果如下:
1)myeclipse下迴圈10000次時:
2)myeclipse下迴圈50000次時:
3)在DOS下運行時: