我的漫漫程序之旅

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

          StringBuffer和StringBuilder添加null值的誤導(dǎo)

          讓我們來(lái)看看這段代碼:

          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é)果會(huì)輸出,有人一定會(huì)說(shuō)輸出0.

          結(jié)果是什么呢?

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

          讓我們來(lái)看看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方法是在它的父類中實(shí)現(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;
              }



          這兩個(gè)append方法都有共同的:

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



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

          評(píng)論

          # re: StringBuffer和StringBuilder添加null值的誤導(dǎo)[未登錄](méi)  回復(fù)  更多評(píng)論   

          個(gè)人覺(jué)得這個(gè)結(jié)果沒(méi)什么誤導(dǎo)的
          2008-05-11 20:46 | Jarod

          # re: StringBuffer和StringBuilder添加null值的誤導(dǎo)  回復(fù)  更多評(píng)論   

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

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

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

          # re: StringBuffer和StringBuilder添加null值的誤導(dǎo)  回復(fù)  更多評(píng)論   

          個(gè)人認(rèn)為throw nullpointexception更為合理,一般來(lái)說(shuō)null是沒(méi)有任何意義的。

          # re: StringBuffer和StringBuilder添加null值的誤導(dǎo)  回復(fù)  更多評(píng)論   

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

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

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

          # re: StringBuffer和StringBuilder添加null值的誤導(dǎo)  回復(fù)  更多評(píng)論   

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 松溪县| 海南省| 新乡市| 沂源县| 凤冈县| 桐梓县| 柯坪县| 湘西| 班戈县| 广宁县| 阳新县| 绩溪县| 玉龙| 衡阳市| 扶余县| 仁寿县| 奉贤区| 巴南区| 霍林郭勒市| 同仁县| 新巴尔虎左旗| 石嘴山市| 普陀区| 夏邑县| 大关县| 阿合奇县| 依兰县| 锡林浩特市| 仙居县| 句容市| 襄城县| 永顺县| 临沂市| 临朐县| 密云县| 梨树县| 沧源| 江门市| 湖州市| 华池县| 聂荣县|