2013-01-03 31 views
1

我在看John的答案here,并认为它很漂亮。我想知道if语句是否可以进一步改进,但我不确定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

你没有改变字符串,你正在改变一个引用变量。 (无论如何,字符串是不可改变的!) –

+5

另外,如果这很重要,那么你应该可以描述它。 –

+0

如果这很重要,我想知道为什么。 –

回答

2

第二个版本肯定会变慢。它不仅仅是一个if,也是一个equals调用,并且大多数情况下,两个比较的字符串会有所不同,因此equals方法不会早期返回 - 相反,它比一个简单的赋值做了更多的工作(查看源代码详情请参阅String中的equals方法)。

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

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从来都不是空的这可能是一个allternative

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

如果serverIds那么一个列表不使用的for-each - 它创建的Iterator(对象) 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]); 
}