更改String vs if语句的值的性能

时间:2013-01-03 20:54:47

标签: java performance

我正在看约翰的答案here,并认为它很漂亮。我想知道是否可以使用if语句进一步改进,但我不确定if语句是否会表现更好。

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

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);
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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]);
}