String 、 StringBuffer、StringBuilder三者的區別
1、String類表示內容不可修改的字符串,StringBuffer(線程安全)和StringBuilder(線程不安全)類都表示內容可以被修改的字符串。
2、執行速度:StringBuilder > StringBuffer > String
String執行速度最慢原因:
String的底層代碼為一個用final修飾的char數組,這意味著定義一個String變量後,該變量的內容是不能夠改變的。
也就是說,你定義一個String變量後,不斷的改變其內容,表面上看起來是改變了內容,因為每次輸出的內容的確是改變了。但是,實際上是在不斷地創建了新的String對象,而變量不斷地指向新的String對象,所以看起來是改變了String對象的內容。
例如:
1 String s= "string1";
2 s = s+"strign2";
這兩行代碼執行後,原始的String對象中的內容沒有改變。s原先指向內容是"string1"的String對象,執行了第二句後,這時s不再指向原來的那個對象,而指向了另一個內容是"string1 string2"的對象,原來的那個對象還存在內存中,只是s不在指向它了。所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
1 String string = new String(); 2 3 StringBuffer sBuffer = new StringBuffer(); 4 //開始時間 5 long startTime; 6 //結束時間 7 long endTime; 8 9 startTime = System.currentTimeMillis(); 10 11 for (int i=0;i<10000;i++) { 12 string += i; 13 } 14 endTime = System.currentTimeMillis(); 15 System.out.println("String執行時間:"+(endTime-startTime)); 16 17 startTime = System.currentTimeMillis(); 18 19 for (int i=0;i<10000;i++) { 20 sBuffer.append(i); 21 } 22 endTime = System.currentTimeMillis(); 23 System.out.println("StringBuffer執行時間:"+(endTime-startTime));
執行結果:
1 String執行時間:329
2 StringBuffer執行時間:2
StringBuffer和StringBuilder
StringBuilder是線程不安全的,所以運行效率高。如果一個字符串是在方法裏定義,這種情況下只可能有一個線程訪問,不存在不安全的因素,所以可以用StringBuilder。如果要在類裏定義成員變量,並且這個類的實例對象會在多線程環境下使用,最好使用StringBuffer。
String 、 StringBuffer、StringBuilder三者的區別