Java 与if语句相比,更改字符串值的性能

Java 与if语句相比,更改字符串值的性能,java,performance,Java,Performance,我看着约翰的答案,觉得很圆滑。我想知道使用if语句是否可以进一步改进,但我不确定if语句是否会执行得更好 if语句是否比更改字符串的值“花费更多” String prefix = ""; for (String serverId : serverIds) { sb.append(prefix); prefix = ","; sb.append(serverId); } VS. String prefix = ""; for (String serverId : serverIds)

我看着约翰的答案,觉得很圆滑。我想知道使用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);
}

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

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

更多版本

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是一个列表,那么不要对每个都使用-它会创建迭代器(对象)和迭代器。下一步检查并发修改

for (int i = 0; i < serverIds.size(); i++) {
  if (i > 0) {
      sb.append(',');
  }
  sb.append(serverId.get(i));
}
for(int i=0;i0){
某人附加(“,”);
}
sb.append(serverId.get(i));
}
对于阵列,它是

for (int i = 0; i < serverIds.length; i++) {
  if (i > 0) {
      sb.append(',');
  }
  sb.append(serverId[i]);
}
for(int i=0;i0){
某人附加(“,”);
}
sb.append(serverId[i]);
}

您不是在更改字符串,而是在更改引用变量。(无论如何,字符串是不可变的!)此外,如果这很重要,那么您可能应该分析它。如果这很重要,我想知道原因。我仍然说在番石榴中使用
Joiner
会更好:)通过编写这个问题,您可能花费的时间比这样的优化节省的时间要多,即使你的程序运行了几十亿次。