1

我在这里查看约翰的答案,并认为它非常巧妙。我想知道是否可以使用 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);
}
4

2 回答 2

2

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

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

于 2013-01-03T21:08:46.730 回答
1

更多版本

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]);
}
于 2013-01-04T00:44:39.430 回答