String、StringBuffer和StringBuild區別


String

String是不可變對象,即對象一旦生成,就不能被更改。對String對象的改變會引發新的String對象的生成。

1 String s = "abcd";
2 s = s+"efgh";

執行以下代碼實際上是生成了一個新的String對象。然后讓引用指向新的String對象。所以內容經常改變的字符串不要使用String類型,由於這樣會造成內存中大量的無引用對象,然后JVM的GC就會開始工作。

例如如下代碼將會產生10000個五引用對象。

 1 String S1 = “abc”; 
 2 
 3         For(int i = 0 ; i < 10000 ; i ++)   
 4 
 5         { 
 6 
 7                S1 + = “def”; 
 8 
 9                S1 = “abc”; 
10 
11 } 

StringBuffer

StrinhBuffer:每次都對對象本身進行操作,而不是生成新的對象。所以在字符串內容不斷改變的情況,建議使用StringBuffer。

String對象的字符串拼接其實是被JVM解釋成了StringBuffer對象的拼接,所以這些時候String對象的速度並不會比StringBuffer慢。

例如:如下代碼,String的效率遠比StringBuffer快。

1  String S1 = “This is only a” + “ simple” + “ test”; 
2  StringBuffer Sb = new StringBuilder(“This is only a”).append(“simple”).append(“ test”); 

這是因為,在JVM眼里:String S1 = “This is only a” + “ simple” + “ test”;就是String S1 = “This is only a simple test”;

StringBuild

StringBuild是JDK1.5新增加的一個類,與StringBuffer具有相同的操作。

區別在於:StringBuffer是線程安全的類。StringBuild不是線程安全的類,在單線程中性能要比StringBuffrer高。

例如:《Think in Java》中,描述HashTable和HashMap區別一樣,就是因為HashTable支持線程同步、保證線程安全而導致的性能下降。

  HashTable是線程安全的,很多方法都是synchronized方法。

  HashMap不是線程安全的,但在單線程程序中的性能比HashTable要高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM