下面先給大家介紹下String、StringBuffer、StringBuilder區(qū)別,具體詳情如下所示:
StringBuffer、StringBuilder和String一樣,也用來代表字符串。String類是不可變類,任何對String的改變都 會(huì)引發(fā)新的String對象的生成;StringBuffer則是可變類,任何對它所指代的字符串的改變都不會(huì)產(chǎn)生新的對象。既然可變和不可變都有了,為何還有一個(gè)StringBuilder呢?相信初期的你,在進(jìn)行append時(shí),一般都會(huì)選擇StringBuffer吧!
先說一下集合的故事,HashTable是線程安全的,很多方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區(qū)別也是如此,他們的原理和操作基本相同,區(qū)別在于StringBufferd支持并發(fā)操作,線性安全的,適 合多線程中使用。StringBuilder不支持并發(fā)操作,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。
接下來,我直接貼上測試過程和結(jié)果的代碼,一目了然:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
public class StringTest { public static String BASEINFO = "Mr.Y" ; public static final int COUNT = 2000000 ; /** * 執(zhí)行一項(xiàng)String賦值測試 */ public static void doStringTest() { String str = new String(BASEINFO); long starttime = System.currentTimeMillis(); for ( int i = 0 ; i < COUNT / 100 ; i++) { str = str + "miss" ; } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used String." ); } /** * 執(zhí)行一項(xiàng)StringBuffer賦值測試 */ public static void doStringBufferTest() { StringBuffer sb = new StringBuffer(BASEINFO); long starttime = System.currentTimeMillis(); for ( int i = 0 ; i < COUNT; i++) { sb = sb.append( "miss" ); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuffer." ); } /** * 執(zhí)行一項(xiàng)StringBuilder賦值測試 */ public static void doStringBuilderTest() { StringBuilder sb = new StringBuilder(BASEINFO); long starttime = System.currentTimeMillis(); for ( int i = 0 ; i < COUNT; i++) { sb = sb.append( "miss" ); } long endtime = System.currentTimeMillis(); System.out.println((endtime - starttime) + " millis has costed when used StringBuilder." ); } /** * 測試StringBuffer遍歷賦值結(jié)果 * * @param mlist */ public static void doStringBufferListTest(List<String> mlist) { StringBuffer sb = new StringBuffer(); long starttime = System.currentTimeMillis(); for (String string : mlist) { sb.append(string); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "buffer cost:" + (endtime - starttime) + " millis" ); } /** * 測試StringBuilder迭代賦值結(jié)果 * * @param mlist */ public static void doStringBuilderListTest(List<String> mlist) { StringBuilder sb = new StringBuilder(); long starttime = System.currentTimeMillis(); for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) { sb.append(iterator.next()); } long endtime = System.currentTimeMillis(); System.out.println(sb.toString() + "builder cost:" + (endtime - starttime) + " millis" ); } public static void main(String[] args) { doStringTest(); doStringBufferTest(); doStringBuilderTest(); List<String> list = new ArrayList<String>(); list.add( " I " ); list.add( " like " ); list.add( " BeiJing " ); list.add( " tian " ); list.add( " an " ); list.add( " men " ); list.add( " . " ); doStringBufferListTest(list); doStringBuilderListTest(list); } } |
看一下執(zhí)行結(jié)果:
2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
I like BeiJing tian an men . buffer cost:1 millis
I like BeiJing tian an men . builder cost:0 millis
從上面的結(jié)果可以看出,不考慮多線程,采用String對象時(shí)(我把Count/100),執(zhí)行時(shí)間比其他兩個(gè)都要高,而采用StringBuffer對象和采用StringBuilder對象的差別也比較明顯。由此可見,如果我們的程序是在單線程下運(yùn)行,或者是不必考慮到線程同步問題,我們應(yīng)該優(yōu)先使用StringBuilder類;如果要保證線程安全,自然是StringBuffer。從后面List的測試結(jié)果可以看出,除了對多線程的支持不一樣外,這兩個(gè)類的使用方式和結(jié)果幾乎沒有任何差別。
以上所述是小編給大家介紹的Java中StringBuffer和StringBuilder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!