【问题标题】:Performance of changing the value of a String vs if statement更改字符串值与 if 语句的性能
【发布时间】:2013-01-03 20:54:46
【问题描述】:

我正在查看 John 的答案 here 并认为它非常巧妙。我想知道是否可以使用 if 语句进一步改进它,但我不确定 if 语句是否会更好。

if 语句是否比更改字符串的值“花费更多”?

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  prefix = ",";
  sb.append(serverId);
}

VS.

String prefix = "";
for (String serverId : serverIds) {
  sb.append(prefix);
  if( prefix.equals( "" ) {
      prefix = ",";
  }
  sb.append(serverId);
}

【问题讨论】:

  • 你不是在改变一个字符串,你是在改变一个引用变量。 (无论如何,字符串是不可变的!)
  • 另外,如果这很重要,那么您可能应该对其进行分析。
  • 如果这很重要,我想知道为什么。
  • 我还是说在 Guava 中使用Joiner 会更好:)
  • 写出这个问题,你可能花费的时间比这种优化所节省的时间还要多,即使你的程序运行了数十亿次。

标签: java performance


【解决方案1】:

第二个版本肯定会更慢。它不仅仅是一个 if,也是一个 equals 调用,而且大多数情况下,两个比较的字符串是不同的,因此 equals 方法不会提前返回 - 相反它比简单的赋值工作更多(查看源代码String 中的 equals 方法的详细信息)。

当然,大多数时候可读性比速度更重要,而 Guava Joiner 可以帮助你编写非常清晰的代码。

【讨论】:

    【解决方案2】:

    更多版本

    boolean addPrefix = false;
    for (String serverId : serverIds) {
      if (addPrefix) {       // it's better than String.equals
          sb.append(',');    // append char is faster than append String
      } else {
          addPrefix = true;  
      }
      sb.append(serverId);
    }
    

    假设 serverIds 永远不会为空,这可能是一种替代方法

    for (String serverId : serverIds) {
         sb.append(serverId).append(',');
    }
    sb.deleteCharAt(sb.length() - 1);
    

    如果 serverIds 是 List 则不要使用 for-each - 它会创建 Iterator (Object) 并且 Iterator.next 检查并发修改

    for (int i = 0; i < serverIds.size(); i++) {
      if (i > 0) {
          sb.append(',');
      }
      sb.append(serverId.get(i));
    }
    

    对于数组是

    for (int i = 0; i < serverIds.length; i++) {
      if (i > 0) {
          sb.append(',');
      }
      sb.append(serverId[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2018-10-15
      • 1970-01-01
      相关资源
      最近更新 更多