मैंने जेएमएच का उपयोग कर आशाजनक दृष्टिकोणों का परीक्षण किया । पूर्ण बेंचमार्क कोड ।
परीक्षणों के दौरान मान लेना (हर बार कोने के मामलों की जाँच से बचने के लिए): इनपुट स्ट्रिंग की लंबाई हमेशा 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);
test6
char 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
।