2012-08-13 15 views
26

संभव डुप्लिकेट:
StringBuilder vs String concatenation in toString() in Javaस्ट्रिंगबिल्डर का स्पष्ट रूप से उपयोग क्यों करें यदि कंपाइलर स्ट्रिंगब्यूल्डर को स्वचालित रूप से स्ट्रिंग कॉन्सटेनेशन को परिवर्तित करता है?

मैं सोच रहा हूँ, क्योंकि संकलक आंतरिक रूप से 2 स्ट्रिंग्स जब स्ट्रिंग संयोजन प्रदर्शन संलग्न करने के लिए एक StringBuilder का उपयोग करता है, तो क्या बात है और का उपयोग कर कारण है कि मैं परेशान स्ट्रिंगबिल्डर अगर स्ट्रिंग कॉन्सटेनेशन ने आपके लिए पहले ही नौकरी की है? क्या कोई अन्य विशिष्ट कारण हैं?

उत्तर

53

जैसा कि आप उल्लेख करते हैं, आपको a + " = " + b जैसे साधारण स्ट्रिंग कॉन्सटेनेशन अभिव्यक्ति के बजाय StringBuilder का उपयोग नहीं करना चाहिए। उत्तरार्द्ध टाइप करने में आसान है, पढ़ने में आसान है, और कंपाइलर किसी भी तरह से StringBuilder आंतरिक रूप से उपयोग करेगा, इसलिए इसे फिर से लिखकर कोई प्रदर्शन लाभ नहीं है।

हालांकि StringBuilder उपयोगी है यदि आप लूप में बड़ी संख्या में तारों को जोड़ रहे हैं। निम्नलिखित कोड अक्षम है। इसके लिए ओ (एन) चलाने के लिए समय और कई अस्थायी तारों की आवश्यकता होती है।

String result = ""; 
for (int i = 0; i < foo.length; ++i) 
{ 
    result += bar(foo[i]); // Bad 
} 

ऐसा करें:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < foo.length; ++i) 
{ 
    sb.append(bar(foo[i])); 
} 
String result = sb.toString(); 

संकलक केवल सरल a + b + c भाव का अनुकूलन। यह उपर्युक्त कोड स्वचालित रूप से अनुकूलित नहीं कर सकता है।

+3

@ जोहानस्जोबर्ग हां, वास्तव में यह करता है। 'परिणाम + = बार (foo [i])' कोड (जैसे javac मानते हैं) 'परिणाम = नया स्ट्रिंगबिल्डर() संलग्न करें (परिणाम) .append (foo [i])। ToString() '। ध्यान दें कि यह एक 'स्ट्रिंगबिल्डर' का उपयोग करने से कहीं अधिक काम है। – oldrinb

+0

@ जोहानस्जोबर्ग बिंदु यह है कि __the नमूने बराबर नहीं हैं – oldrinb

+0

मैं अभी भी स्पष्ट नहीं हूं क्यों ?? क्या ऐसा इसलिए है क्योंकि इसे पहले नमूने के लिए संगतता से पहले पुरानी स्ट्रिंग (पिछली) पर प्रतिलिपि बनाना आवश्यक है? – peter

3

आप कहां मान रहे हैं कि स्ट्रिंग कंसटिनेशन आंतरिक रूप से स्ट्रिंगबिल्डर का उपयोग करता है? हो सकता है कि एक साधारण कॉन्सट ऑप्टिमाइज़ हो जाए, लेकिन यह निश्चित रूप से नहीं होगा:

String s = ""; 

for (int i = 0; i < 1000; i++){ 
    for (int j = 0; j < 1000; j++){ 
    s+= "" + i + j 
} 
} 
+1

तो यह आंतरिक रूप से क्या होगा? – peter

+0

@ user1389813 's = new StringBuilder.append (" ")। संलग्न करें (i) .append (j) .toString();' संकलक मानते हुए javac है। – oldrinb

+0

इसलिए प्रत्येक बार जब यह concatenation करने के लिए एक नया स्ट्रिंगबिल्डर बना देगा, तो यही कारण है कि यह खराब और धीमा, सही है? – peter

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^