<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    lotusswan

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

    相信大家看到過很多比較String和StringBuffer區別的文章,也明白這兩者的區別,然而自從Java 5.0發布以后,我們的比較列表上將多出一個對象了,這就是StringBuilder類。String類是不可變類,任何對String的改變都會引發新的String對象的生成;而StringBuffer則是可變類,任何對它所指代的字符串的改變都不會產生新的對象,可變和不可變類這一對對象已經齊全了,那么為什么還要引入新的StringBuilder類干嗎?相信大家都有此疑問,我也如此。下面,我們就來看看引入該類的原因。

    為什么會出現那么多比較String和StringBuffer的文章?原因在于當改變字符串內容時,采用StringBuffer能獲得更好的性能。既然是為了獲得更好的性能,那么采用StringBuffer能夠獲得最好的性能嗎?答案是NO!為什么?如果你讀過《Think in Java》,而且對里面描述HashTable和HashMap區別的那部分章節比較熟悉的話,你一定也明白了原因所在。對,就是支持線程同步保證線程安全而導致性能下降的問題。HashTable是線程安全的,很多方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也在于此,新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。如果你對此不太相信,可以試試下面的例子:

    package ?com.jiang.tiger.chap1;

    import ?java.util.ArrayList;
    import ?java.util.Iterator;
    import ?java.util.List;

    public ? class ?StringBuilderTester? {
    ????
    private ? static ? final ?String?base? = ? " base?string. " ;
    ????
    private ? static ? final ? int ?count? = ? 2000000 ;
    ????
    public ? static ? void ?stringTest()? {
    ????????
    long ?begin,?end;
    ????????begin?
    = ?System.currentTimeMillis();
    ????????String?test?
    = ? new ?String(base);
    ????????
    for ?( int ?i? = ? 0 ;?i? < ?count? / ? 100 ;?i ++ )? {
    ????????????test?
    = ?test? + ? " add " ;
    ????????}

    ????????end?
    = ?System.currentTimeMillis();
    ????????System.out.println((end?
    - ?begin)? + ? " millis?has?elapsed?when?used?String. " );????????
    ????}

    ????
    ????
    public ? static ? void ?stringBufferTest()? {
    ????????
    long ?begin,?end;
    ????????begin?
    = ?System.currentTimeMillis();
    ????????StringBuffer?test?
    = ? new ?StringBuffer(base);
    ????????
    for ?( int ?i? = ? 0 ;?i? < ?count;?i ++ )? {
    ????????????test?
    = ?test.append( " add " );
    ????????}

    ????????end?
    = ?System.currentTimeMillis();
    ????????System.out.println((end?
    - ?begin)? + ? " millis?has?elapsed?when?used?StringBuffer. " );????
    ????}

    ????
    ????
    public ? static ? void ?stringBuilderTest()? {
    ????????
    long ?begin,?end;
    ????????begin?
    = ?System.currentTimeMillis();
    ????????StringBuilder?test?
    = ? new ?StringBuilder(base);
    ????????
    for ?( int ?i? = ? 0 ;?i? < ?count;?i ++ )? {
    ????????????test?
    = ?test.append( " add " );
    ????????}

    ????????end?
    = ?System.currentTimeMillis();
    ????????System.out.println((end?
    - ?begin)? + ? " millis?has?elapsed?when?used?StringBuilder. " );????
    ????}

    ????
    ?????
    public ? static ?String?appendItemsToStringBuiler(List?list)? {
    ????????????StringBuilder?b?
    = ? new ?StringBuilder(?);
    ????
    ????????????
    for ?(Iterator?i? = ?list.iterator(?);?i.hasNext(?);?)? {
    ??????????????b.append(i.next(?)).append(
    " ? " );
    ????????????}

    ????
    ????????????
    return ?b.toString(?);
    ??????}


    ??????
    public ? static ? void ?addToStringBuilder()? {
    ????????????List?list?
    = ? new ?ArrayList(?);
    ????????????list.add(
    " I " );
    ????????????list.add(
    " play " );
    ????????????list.add(
    " Bourgeois " );
    ????????????list.add(
    " guitars " );
    ????????????list.add(
    " and " );
    ????????????list.add(
    " Huber " );
    ????????????list.add(
    " banjos " );

    ????????????System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
    ??????}


    ?????????
    public ? static ?String?appendItemsToStirngBuffer(List?list)? {
    ????????????????StringBuffer?b?
    = ? new ?StringBuffer(?);
    ????????
    ????????????????
    for ?(Iterator?i? = ?list.iterator(?);?i.hasNext(?);?)? {
    ??????????????????b.append(i.next(?)).append(
    " ? " );
    ????????????????}

    ????????
    ????????????????
    return ?b.toString(?);
    ??????????}


    ??????????
    public ? static ? void ?addToStringBuffer()? {
    ????????????????List?list?
    = ? new ?ArrayList(?);
    ????????????????list.add(
    " I " );
    ????????????????list.add(
    " play " );
    ????????????????list.add(
    " Bourgeois " );
    ????????????????list.add(
    " guitars " );
    ????????????????list.add(
    " and " );
    ????????????????list.add(
    " Huber " );
    ????????????????list.add(
    " banjos " );

    ????????????????System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
    ??????????}

    ??????????
    ????
    public ? static ? void ?main(String[]?args)? {
    ????????stringTest();
    ????????stringBufferTest();
    ????????stringBuilderTest();
    ????????addToStringBuffer();
    ????????addToStringBuilder();
    ????}

    上面的程序結果如下:
    11359millis?has?elapsed?when?used?String.
    344millis?has?elapsed?when?used?StringBuffer.
    234millis?has?elapsed?when?used?StringBuilder.
    I?play?Bourgeois?guitars?and?Huber?banjos?
    I?play?Bourgeois?guitars?and?Huber?banjos?

    從上面的結果來看,這三個類在單線程程序中的性能差別一目了然,采用String對象時,即使運行次數僅是采用其他對象的1/100,其執行時間仍然比其他對象高出25倍以上;而采用StringBuffer對象和采用StringBuilder對象的差別也比較明顯,前者是后者的1.5倍左右。由此可見,如果我們的程序是在單線程下運行,或者是不必考慮到線程同步問題,我們應該優先使用StringBuilder類;當然,如果要保證線程安全,自然非StringBuffer莫屬了。

    除了對多線程的支持不一樣外,這兩個類的使用幾乎沒有任何差別,上面的例子就是個很好的說明。appendItemsToStringBuiler和appendItemsToStirngBuffer兩個方法除了采用的對象分別為StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同。
    posted on 2006-11-28 22:27 lotusswan 閱讀(1058) 評論(0)  編輯  收藏 所屬分類: Tiger學習筆記
    主站蜘蛛池模板: 亚洲国产精品综合福利专区| 亚洲一区二区三区在线观看精品中文| 亚洲AV无码一区东京热| 无码专区一va亚洲v专区在线| 中文字幕亚洲码在线| 妞干网在线免费视频| 亚洲国产美女精品久久久| 永久免费AV无码网站国产| 亚洲精品国产成人片| 最近免费中文字幕MV在线视频3| 亚洲精品蜜桃久久久久久| a级毛片黄免费a级毛片| 国产无遮挡又黄又爽免费视频| 亚洲精品无码高潮喷水A片软| 成人免费无码精品国产电影| 美女无遮挡免费视频网站| 国产在线观看片a免费观看| 亚洲第一男人天堂| 国产成人高清精品免费鸭子 | 亚洲精品成人网久久久久久| 羞羞视频在线免费观看| 国产亚洲?V无码?V男人的天堂| 亚洲另类自拍丝袜第五页| 免费大片在线观看网站| 国产日韩AV免费无码一区二区三区 | 亚洲国产a级视频| 在线观看亚洲电影| 亚洲无码精品浪潮| 精品亚洲成A人在线观看青青| 亚洲国产精品一区二区九九| 青柠影视在线观看免费| 亚洲一区二区影视| 又粗又黄又猛又爽大片免费| 在线成人精品国产区免费| 亚洲码在线中文在线观看| 免费无码又爽又刺激毛片| a级日本高清免费看| 在线精品亚洲一区二区| 猫咪社区免费资源在线观看 | 午夜无码A级毛片免费视频| 国产精品亚洲四区在线观看 |