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

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

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

    我的漫漫程序之旅

    專注于JavaWeb開發(fā)
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數(shù)據(jù)加載中……

    StringBuffer和StringBuilder添加null值的誤導

    讓我們來看看這段代碼:

    package com;

    public class StringTest2
    {
        
    public static void main(String[] args)
        
    {
            StringBuffer sb 
    = new StringBuffer();
            String s 
    = null;
            sb.append(s);
            System.out.println(sb.length());
            StringBuilder sb2 
    = new StringBuilder();
            sb2.append(s);
            System.out.println(sb2.length());
        }


    }

    結(jié)果會輸出,有人一定會說輸出0.

    結(jié)果是什么呢?

    4
    null
    4
    怎么回事呢,明明添加了一個null值,結(jié)果竟然是4.

    讓我們來看看append方法的源碼就知道了.
    StringBuilder:
    // Appends the specified string builder to this sequence.
        private StringBuilder append(StringBuilder sb) {
        
    if (sb == null)
                
    return append("null");
        
    int len = sb.length();
        
    int newcount = count + len;
        
    if (newcount > value.length)
            expandCapacity(newcount);
        sb.getChars(
    0, len, value, count);
        count 
    = newcount;
            
    return this;
        }

    StringBuffer的append方法是在它的父類中實現(xiàn)的:
     public AbstractStringBuilder append(String str) {
        
    if (str == null) str = "null";
            
    int len = str.length();
        
    if (len == 0return this;
        
    int newCount = count + len;
        
    if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(
    0, len, value, count);
        count 
    = newCount;
        
    return this;
        }



    這兩個append方法都有共同的:

    if (str == null) str = "null";
            
    int len = str.length();
    如果str 是 null,就賦予str = "null" 這個字符串,而再是
    null了.
    而"null"這個字符串的長度自然是4了.



    posted on 2008-05-11 19:32 々上善若水々 閱讀(3747) 評論(5)  編輯  收藏

    評論

    # re: StringBuffer和StringBuilder添加null值的誤導[未登錄]  回復  更多評論   

    個人覺得這個結(jié)果沒什么誤導的
    2008-05-11 20:46 | Jarod

    # re: StringBuffer和StringBuilder添加null值的誤導  回復  更多評論   

    這個正常
    第一沒有人有意會往其中 append 一個 null
    第二程序執(zhí)行中 append 一個 null,顯示出來是個 null 不正好讓我們能知道中間發(fā)生了什么事嗎?

    就像 String s = null;
    System.out.println(s);

    輸出 null 一樣。
    2008-05-11 20:57 | 隔葉黃鶯

    # re: StringBuffer和StringBuilder添加null值的誤導  回復  更多評論   

    個人認為throw nullpointexception更為合理,一般來說null是沒有任何意義的。

    # re: StringBuffer和StringBuilder添加null值的誤導  回復  更多評論   

    哈哈,這么實現(xiàn)也是沒辦法的事。樓主可以想象,如果是你實現(xiàn)append方法,你會怎么做呢。append(null) 會將null做如何處理呢?

    我想大多數(shù)人可能都會給出三種處理方案:
    1. 直接返回null。一般來講,append方法都是返回一個StringBuilder對象,所以返回null,有些不符合append的設(shè)計思想。
    2. 什么都不做,返回原來的StringBuilder對象。這么做似乎合理,但是往StringBuilder里放null,總得和往里放空串有點區(qū)別吧。所謂人過留名,雁過留聲。所以這種看似合理的方法卻不太好。
    3. 這種方案就是現(xiàn)在append方法的實現(xiàn)方案了,將null變成"null"。

    因此,將null變成"null"是最佳的方案。
    2008-05-11 22:43 | 銀河使者

    # re: StringBuffer和StringBuilder添加null值的誤導  回復  更多評論   

    樓上正解
    2008-05-12 08:32 | 々上善若水々

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲国产成人精品女人久久久| 一二三四免费观看在线电影 | 久久久久久毛片免费播放 | 亚洲综合国产精品| 午夜视频在线免费观看| 亚洲中文无码mv| 成人毛片100免费观看| 亚洲国产婷婷综合在线精品| 亚洲综合小说久久另类区| 最近2019中文字幕免费直播| 亚洲视频在线一区二区三区| 亚洲一区在线免费观看| 亚洲日本乱码在线观看| 永久免费A∨片在线观看| 久久精品国产亚洲AV高清热| 3344免费播放观看视频 | 亚洲精品无码久久久久sm| jizzjizz亚洲日本少妇| 亚洲av麻豆aⅴ无码电影| 亚洲色大成WWW亚洲女子| 国产在线a不卡免费视频| 成人一级免费视频| 啊v在线免费观看| 亚洲av永久无码天堂网| 朝桐光亚洲专区在线中文字幕 | 久久久久亚洲?V成人无码| 亚洲a无码综合a国产av中文| 亚洲电影日韩精品| 秋霞人成在线观看免费视频| 亚洲不卡中文字幕| 91成年人免费视频| 99亚洲精品卡2卡三卡4卡2卡| 最新国产AV无码专区亚洲| 成人特级毛片69免费观看| 亚洲日本在线看片| 国产成人精品男人免费| 无码中文字幕av免费放dvd| 亚洲日本VA午夜在线电影| 国产aⅴ无码专区亚洲av麻豆 | 午夜影院免费观看| 鲁死你资源站亚洲av|