您使用的代碼(我在類似情況下使用過)的缺點是它看起來有點笨重,理論上至少會生成兩個立即丟棄的臨時字符串。如果您的字符串少於兩個字符,也會出現問題。
好處在於,您不會在表達式之外引用這些臨時字符串(讓字節碼編譯器或JIT優化程序將其打開以優化),並且您的意圖對於任何未來的代碼維護者都是明確的。
除非你需要做幾百萬次這些任何給定的第二個和檢測這樣做的顯着性能問題,我不會擔心性能,並希望清晰。我也會把它埋在某個地方的實用課程中。 :-)另見jambjo對另一個答案的迴應,指出String#toLowerCase
和Character.toLowerCase
之間有一個重要的區別。 (編輯:答案,因此評論已被刪除基本上,有相關的語言環境和Unicode和文檔有很大的不同建議使用String#toLowerCase
,不Character.toLowerCase
; more here。)
編輯因爲我在一個奇怪的心情,我想我會看看在一個簡單的測試中是否有可測量的性能差異。有。這可能是因爲語言環境差(例如,蘋果與橘子)的:
public class Uncap
{
public static final void main(String[] params)
{
String s;
String s2;
long start;
long end;
int counter;
// Warm up
s = "Testing";
start = System.currentTimeMillis();
for (counter = 1000000; counter > 0; --counter)
{
s2 = uncap1(s);
s2 = uncap2(s);
s2 = uncap3(s);
}
// Test v2
start = System.currentTimeMillis();
for (counter = 1000000; counter > 0; --counter)
{
s2 = uncap2(s);
}
end = System.currentTimeMillis();
System.out.println("2: " + (end - start));
// Test v1
start = System.currentTimeMillis();
for (counter = 1000000; counter > 0; --counter)
{
s2 = uncap1(s);
}
end = System.currentTimeMillis();
System.out.println("1: " + (end - start));
// Test v3
start = System.currentTimeMillis();
for (counter = 1000000; counter > 0; --counter)
{
s2 = uncap3(s);
}
end = System.currentTimeMillis();
System.out.println("3: " + (end - start));
System.exit(0);
}
// The simple, direct version; also allows the library to handle
// locales and Unicode correctly
private static final String uncap1(String s)
{
return s.substring(0,1).toLowerCase() + s.substring(1);
}
// This will *not* handle locales and unicode correctly
private static final String uncap2(String s)
{
return Character.toLowerCase(s.charAt(0)) + s.substring(1);
}
// This will *not* handle locales and unicode correctly
private static final String uncap3(String s)
{
StringBuffer sb;
sb = new StringBuffer(s);
sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
return sb.toString();
}
}
我混了在各種測試中的順序(走動它們並重新編譯),以避免加速時間問題(並試圖無論如何強迫一些)。非常不科學,但uncap1
一直比uncap2
和uncap3
慢約40%。這並不重要,我們所談論的是在Intel Atom處理器上百萬次迭代中400ms的差異。 :-)
所以:我會用簡單,直接的代碼包裝在一個實用函數中。
檢查StringUtils的:http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringUtils.html – Trick 2010-03-15 13:36:49