मैंने जेएमएच का उपयोग कर आशाजनक दृष्टिकोणों का परीक्षण किया । पूर्ण बेंचमार्क कोड ।
परीक्षणों के दौरान मान लेना (हर बार कोने के मामलों की जाँच से बचने के लिए): इनपुट स्ट्रिंग की लंबाई हमेशा 1 से अधिक होती है।
परिणाम
Benchmark Mode Cnt Score Error Units
MyBenchmark.test1 thrpt 20 10463220.493 ± 288805.068 ops/s
MyBenchmark.test2 thrpt 20 14730158.709 ± 530444.444 ops/s
MyBenchmark.test3 thrpt 20 16079551.751 ± 56884.357 ops/s
MyBenchmark.test4 thrpt 20 9762578.446 ± 584316.582 ops/s
MyBenchmark.test5 thrpt 20 6093216.066 ± 180062.872 ops/s
MyBenchmark.test6 thrpt 20 2104102.578 ± 18705.805 ops/s
स्कोर प्रति सेकंड ऑपरेशन हैं, जितना बेहतर होगा।
टेस्ट
test1 पहले एंडी और हेलिंक का दृष्टिकोण था:
string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2दूसरा एंडी का दृष्टिकोण था। यह Introspector.decapitalize()डैनियल द्वारा भी सुझाया गया है, लेकिन दो ifबयानों के बिना । पहले ifपरीक्षण धारणा के कारण हटा दिया गया था। दूसरे को हटा दिया गया था, क्योंकि यह शुद्धता का उल्लंघन कर रहा था (यानी इनपुट "HI"वापस आ जाएगा "HI")। यह लगभग सबसे तेज था।
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
string = new String(c);
test3का एक संशोधन था test2, लेकिन इसके बजाय Character.toLowerCase(), मैं 32 जोड़ रहा था, जो सही ढंग से काम करता है अगर और केवल अगर स्ट्रिंग ASCII में है। यह सबसे तेज था। c[0] |= ' 'माइक की टिप्पणी से भी यही प्रदर्शन हुआ।
char c[] = string.toCharArray();
c[0] += 32;
string = new String(c);
test4इस्तेमाल किया StringBuilder।
StringBuilder sb = new StringBuilder(string);
sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
string = sb.toString();
test5दो substring()कॉल का उपयोग किया ।
string = string.substring(0, 1).toLowerCase() + string.substring(1);
test6char value[]सीधे स्ट्रिंग में बदलने के लिए प्रतिबिंब का उपयोग करता है । यह सबसे धीमा था।
try {
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(string);
value[0] = Character.toLowerCase(value[0]);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
निष्कर्ष
यदि स्ट्रिंग की लंबाई हमेशा 0 से अधिक है, तो उपयोग करें test2।
यदि नहीं, तो हमें कोने के मामलों की जाँच करनी होगी:
public static String decapitalize(String string) {
if (string == null || string.length() == 0) {
return string;
}
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
return new String(c);
}
यदि आप सुनिश्चित हैं कि आपका पाठ हमेशा ASCII में होगा और आप चरम प्रदर्शन की तलाश कर रहे हैं, क्योंकि आपको यह कोड अड़चन में मिला, उपयोग करें test3।