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,這個比較是相對的,且不是絕對的一般情況下,速度從快到慢: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下執行時:關係相關文章請關注PHP中文網!