1. 程式人生 > >String 、 StringBuffer、StringBuilder三者的區別

String 、 StringBuffer、StringBuilder三者的區別

下使用 color ren 線程不安全 新的 的確 開始時間 pre str

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三者的區別