我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

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());
    }


}

结果会输出,有人一定会说输出0.

结果是什么呢?

4
null
4
怎么回事呢,明明添加了一个null值,结果竟然是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方法是在它的父类中实现的:
 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 々上善若水々 阅读(3706) 评论(5)  编辑  收藏

评论

# re: StringBuffer和StringBuilder添加null值的误导[未登录]  回复  更多评论   

个人觉得这个结果没什么误导的
2008-05-11 20:46 | Jarod

# re: StringBuffer和StringBuilder添加null值的误导  回复  更多评论   

这个正常
第一没有人有意会往其中 append 一个 null
第二程序执行中 append 一个 null,显示出来是个 null 不正好让我们能知道中间发生了什么事吗?

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

输出 null 一样。
2008-05-11 20:57 | 隔叶黄莺

# re: StringBuffer和StringBuilder添加null值的误导  回复  更多评论   

个人认为throw nullpointexception更为合理,一般来说null是没有任何意义的。
2008-05-11 22:40 | 三人行,必有我师焉

# re: StringBuffer和StringBuilder添加null值的误导  回复  更多评论   

哈哈,这么实现也是没办法的事。楼主可以想象,如果是你实现append方法,你会怎么做呢。append(null) 会将null做如何处理呢?

我想大多数人可能都会给出三种处理方案:
1. 直接返回null。一般来讲,append方法都是返回一个StringBuilder对象,所以返回null,有些不符合append的设计思想。
2. 什么都不做,返回原来的StringBuilder对象。这么做似乎合理,但是往StringBuilder里放null,总得和往里放空串有点区别吧。所谓人过留名,雁过留声。所以这种看似合理的方法却不太好。
3. 这种方案就是现在append方法的实现方案了,将null变成"null"。

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

# re: StringBuffer和StringBuilder添加null值的误导  回复  更多评论   

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

只有注册用户登录后才能发表评论。


网站导航: