(1)string
1,Stirng是對象不是基本數據類型
2,String是final類,不能被繼承。是不可變對象,一旦創建,就不能修改它的值。
3,對於已經存在的Stirng對象,修改它的值,就是重新創建一個對象,然后將新值賦予這個對象
(2)stringBuffer
1,一個類似於 String 的字符串緩沖區,對它的修改的不會像String那樣重創建對象。
2,使用append()方法修改Stringbuffer的值,使用toString()方法轉換為字符串。
3,線程安全,效率低
(3)stringBuild
是jdk1.5后用來替換stringBuffer的一個類,大多數時候可以替換StringBuffer。和StringBuffer的區別在於Stringbuild是一個單線程使用的類,
不執行線程同步所以比 StringBuffer的速度快,效率高。是線程非安全的。
(4)區別,聯系
使用舉例
String s1 = “hello”;
s1=“world”;
這個操作其實是:其實是創建了兩個String對象。
String s2 = "hello"
s2 += "world";
這操作是:先創建一個String對象,在接下來進行字符串連接的時候,有創建了一個StringBuild(jdk1.5前是StringBuffer),然后調用append()方法,最后調用toString()方法。
有此可以看出String對字符的操作比直接使用Stringbuffer(或者StringBuild)要多出附加的操作,而且String是不可變對象,使用String對字符串操作會產生大量的、多余java對象。所以結果是:影響性能,占用空間。
程序舉例:
分別使用String和StringBuffer對字符串“0123456789”累加10000次,然后統計耗時多長
String str = "0123456789";
String str2 = "";
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
str2 += str;
}
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);
運行多次,在我的機器上平均時間約等於3300,即3.3秒,下面用StringBuffer來操作,查看結果
String str = "0123456789";
StringBuffer sb = new StringBuffer();
int count = 10000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
sb.append(str);
}
String str2 = sb.toString();
long end = System.currentTimeMillis();
long time = (end - start);
System.out.println(time);
同樣在我的機器上結果平均結果小於10,即0.01秒,兩者相差300多倍,而且隨着循環次數的增加這個差距逐漸增大