2013-01-03 49 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]); 
}