char,String,StringBuffer,StringBuilder區別
在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要快。兩者的方法基本相同。

浙公網安備 33010602011771號