मुझे लगता है कि StringBuilder
बनाम +
के उपयोग वास्तव में संदर्भ आप में प्रयोग कर रहे हैं पर निर्भर करता है।
आम तौर पर JDK 1.6 का उपयोग कर और संकलक ऊपर स्वचालित रूप से StringBuilder
का उपयोग कर एक साथ तार में शामिल हो जाएगा।
String one = "abc";
String two = "xyz";
String three = one + two;
यह संकलन होगा String three
के रूप में:
String three = new StringBuilder().append(one).append(two).toString();
यह काफी उपयोगी है और हमें कुछ क्रम बचाता है। हालांकि यह प्रक्रिया हमेशा अनुकूल नहीं है। उदाहरण के लिए ले लो:
String out = "";
for(int i = 0; i < 10000 ; i++) {
out = out + i;
}
return out;
हम बाईटकोड को संकलन और उसके बाद विघटित बाईटकोड उत्पन्न हम की तरह कुछ मिलता है:
String out = "";
for(int i = 0; i < 10000; i++) {
out = new StringBuilder().append(out).append(i).toString();
}
return out;
संकलक भीतरी पाश को अनुकूलित किया है लेकिन निश्चित रूप से सबसे अच्छा संभव अनुकूलन नहीं किया है ।हमारे कोड में सुधार करने के लिए हम इस्तेमाल कर सकते हैं:
StringBuilder out = new StringBuilder();
for(int i = 0 ; i < 10000; i++) {
out.append(i);
}
return out.toString();
अब इस संकलक उत्पन्न कोड की तुलना में अधिक इष्टतम है, इसलिए वहाँ निश्चित रूप से ऐसे मामलों में जहां कुशल कोड की जरूरत है में StringBuilder
/StringBuffer
वर्गों का उपयोग कोड लिखने के लिए एक की जरूरत है। मौजूदा कंपाइलर्स लूप में तारों को जोड़ने में बहुत अच्छे नहीं हैं, हालांकि यह भविष्य में बदल सकता है।
आपको यह देखने के लिए ध्यान से देखना होगा कि आपको StringBuilder
मैन्युअल रूप से लागू करने की आवश्यकता है और इसका उपयोग करने का प्रयास करें जहां यह आपके कोड की पठनीयता को भी कम नहीं करेगा।
नोट: मैंने जेडीके 1.6 का उपयोग करके कोड संकलित किया, और javap
प्रोग्राम का उपयोग करके कोड को डीकंपिल्ड किया, जो बाइट कोड थूकता है। यह समझना काफी आसान है और अक्सर कोड को अनुकूलित करने का प्रयास करते समय देखने के लिए एक उपयोगी संदर्भ है। कंपाइलर आपको दृश्यों के पीछे कोड बदल देता है, इसलिए यह देखना हमेशा दिलचस्प होता है कि यह क्या करता है!
यहां अच्छा विश्लेषण है: http://www.javacodegeeks.com/2013/03/java-stringbuilder-myth-debunked.html – marcolopes