【问题标题】:String variables concatenation字符串变量连接
【发布时间】:2016-03-30 06:06:35
【问题描述】:

我有几行代码如下。在这里我的问题是更喜欢哪一个?

public static String convertMapToString ( Map < String, String > map )
{
    StringBuilder str = new StringBuilder ( 200 ) ;
    for ( Entry < String, String > entry : map.entrySet ( ) )
    {
        str.append ( entry.getKey() + " = " + entry.getValue() ) ; 
    }
    return str.toString()  ;
}

或者我应该跟随,因为我怀疑上面的 appned 语句可能会由于 + 操作而创建另外两个额外的字符串 在每次迭代中。

public static String convertMapToString ( Map < String, String > map )
{
    StringBuilder str = new StringBuilder ( 200 ) ;
    for ( Entry < String, String > entry : map.entrySet ( ) )
    {
        str.append (entry.getKey());
        str.append (" = ");
        str.append (entry.getValue()) ; 
    }
    return str.toString()  ;
}

【问题讨论】:

  • 反编译这两个版本,看看编译器对它们做了什么。
  • 第二个 sn-p 生成的 String 对象可能比第一个少,所以我更喜欢它。
  • @Tom 同意,我的猜测是第 2 个选项“更好”,因为需要连接字符串,StringBuilder 必须循环相同数量的 char .所以选项 1 似乎与选项 2 相同,但多了一个不必要的连接
  • @Tom 我发现这两个版本的反编译代码除了将键和值部分转换为字符串外没有任何变化。你指的是这个还是你想让我意识到其他什么?
  • 那么编译后的代码对于两个版本都是一样的,那么你选择什么都没关系。但是看,第一个版本没有编译成str.append(new StringBuilder(entry.getKey()).append(" = ").append(entry.getValue()).toString());。

标签: java string string-concatenation


【解决方案1】:

按照传统观点,为了获得最佳的 Strings 连接,您应该更喜欢 StringBuilder.append 方法,因此这将是您示例中的选项 2。

请注意,根据language spec,即使您使用"+" 连接,实现可能会选择将它们优化为StringBuilder.append,但不能保证,所以我建议始终如果最佳执行是您的首要任务,请选择选项 2。

【讨论】:

  • 感谢该规范链接
【解决方案2】:

为了可读性:第一个。

为了表现:第二个

第二个代码应该生成更少的对象,因此更快并且使用更少的内存。 (尽管编译器会尝试优化代码以使用 StringBuilders,但就像@Jas 所说:这是没有保证的)

现在,知道了这一点,请使用您需要的任何东西或您认为更适合您的情况的任何东西。

我通常只在循环中使用 StringBuilders 并在它们之外添加字符串。

【讨论】:

  • 但是使用的内存和所有:这只是一个疯狂的猜测,因为您认为可能是这样,还是您实际上比较了编译结果?
  • 你说得对,@Tom,我已经编辑了回复。它应该是相同的性能和相同的编译代码,但这不是保证。因此,如果您想确保使用 StringBuilders,您应该将它们自己放入您的代码中,或者取消编译您编译的所有代码以检查它(显然,如果您更改编译器;再次)。因此,我在循环内部使用 StringBuilders,在它们外部使用简单的函数和字符串添加。
【解决方案3】:

版本 2 是首选,因为版本 1 会不必要地创建一堆对象,并且执行速度会明显变慢。

字符串连接被编译为创建一个新的StringBuilder,为每个部分调用append,然后调用toString。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2016-11-15
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多