在java中有3個類來負責字元的操作。
1.Character是進行單個字元操作的,
2.String 對一串字元進行操作。不可變類。
3.StringBuffer 對一串字元進行操作,但是可變類(安全執行緒),適用於多線程程式中,保證同步性。
4.StringBuilder 對一串字元進行操作,但是可變類(非安全執行緒),適用於單線程程式中,不保證同步性。
String:
是對象不是原始類型;
為不可變對象,一旦被建立,就不能修改它的值;
對於已經存在的String對象的修改都是重新建立一個新的對象,然後把新的值儲存進去;
String 是final類,即不能被繼承。
StringBuffer:
是一個可變對象,當對他進行修改的時候不會像String那樣重建立立對象,只能通過建構函式來建立;
StringBuffer sb = new StringBuffer();//不能通過付值符號對他進行付值. sb = "welcome to here!";//error
對象被建立以後,在記憶體中就會分配記憶體空間,並初始儲存一個null.向StringBuffer中付值的時候可以通過它的append方法.
sb.append("hello");
字串串連操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的處理步驟實際上是通過建立一個StringBuffer,然後調用append(),最後再將StringBuffer.toSting();
這樣的話String的串連操作就比StringBuffer多出了一些附加操作,當然效率上要打折扣.
並且由於String對象是不可變對象,每次操作String都會重建立立新的對象來儲存新的值.這樣原來的對象就沒用了,就要被記憶體回收.這也是要影響效能的.
看看以下代碼:
將26個英文字母重複加了5000次,
String tempstr = "abcdefghijklmnopqrstuvwxyz";int times = 5000;long lstart1 = System.currentTimeMillis();String str = "";for (int i = 0; i < times; i++) { str += tempstr;}long lend1 = System.currentTimeMillis();long time = (lend1 - lstart1);System.out.println(time);
5000次,25;10000次,92;100000,16200。
我們再看看以下代碼
String tempstr = "abcdefghijklmnopqrstuvwxyz";int times = 5000;long lstart2 = System.currentTimeMillis();StringBuffer sb = new StringBuffer();for (int i = 0; i < times; i++) { sb.append(tempstr);}long lend2 = System.currentTimeMillis();long time2 = (lend2 - lstart2);System.out.println(time2);
5000次,2;10000次,4;100000次,44
所以結論很明顯,StringBuffer的速度幾乎是String上萬倍。當然這個資料不是很準確。隨著迴圈的次數在100000次的時候,差異更大。
總結: 如果在程式中需要對字串進行頻繁的修改串連操作的話.使用StringBuffer效能會更高
StringBuilder:
當我們在字串緩衝去被多個線程使用時,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
在大部分情況下 StringBuilder > StringBuffer
java.lang.StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與StringBuffer相容的API,但不保證同步。該類被設計用作StringBuffer的一個簡易替換,用在字串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比StringBuffer要快。兩者的方法基本相同。