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要高。