【问题标题】:String concatenation with Null与 Null 的字符串连接
【发布时间】:2011-05-11 02:27:08
【问题描述】:

我有以下代码

System.out.println("" + null);

输出为null
Java 是如何实现字符串连接的?

【问题讨论】:

    标签: java string


    【解决方案1】:

    因为 Java 将表达式 "A String" + x 转换为类似于 "A String" + String.valueOf(x) 的内容

    实际上我认为它可能使用StringBuilders,所以:

    "A String " + x + " and another " + y
    

    解决效率更高

    new StringBuilder("A String ")
        .append(x)
        .append(" and another ")
        .append(y).toString()
    

    这使用了 String builder 上的 append 方法(针对每种类型),它可以正确处理 null

    【讨论】:

    • IIRC,它实际上并没有达到String.valueOf(y)。每种可能的类型都有StringBuilder.append 的重载,append(Object) 直接处理 null。不过,您可以将“我认为它可能”替换为“它”。
    • 是的 - 恐怕我老了 - 从字符串连接性能不佳的那一天开始!
    • 刚刚检查了append(Object) 的代码,它实际上委托给String.valueOf()Inside 方法。所以他们归结为相同的调用。
    【解决方案2】:

    Java 在幕后使用StringBuilder.append( Object obj )

    不难想象它的实现。

    public StringBuilder append( Object obj )
    {
       if ( obj == null )
       {
           append( "null" );
       }
       else
       {
           append( obj.toString( ) );
       }
    
       return this;
    }
    
    【解决方案3】:

    代码"" + null被编译器转换为

    new StringBuffer().append("").append(null);
    

    并且 StringBuffer 将 null 替换为字符串“null”。所以结果是字符串“null”。

    【讨论】:

    • 只是一个小修正;现在是 StringBuilder 而不是 StringBuffer。线程安全不是字符串连接的问题(无论如何在构建器的生命周期内)。
    • 为什么要/需要写"" + null 而不仅仅是"null"?这个例子只是为了学术练习吗?
    • @user46874:我认为这一定是一个实验,看看如何打印空值。
    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多