2010-01-13 20 views
6

जोड़कर जबकि मैं जब भी तरह स्ट्रिंग में संख्या को जोड़ने का प्रयास:स्पीड मुद्दा तार

String s=new String(); 

for(int j=0;j<=1000000;j++) 

    s+=String.valueOf(j); 

मेरे कार्यक्रम जोड़कर मिलने जाता है, लेकिन बहुत धीरे धीरे। लेकिन जब मैंने अपना प्रोग्राम बदल दिया और इसे बनाया:

StringBuffer sb=new StringBuffer(); 

for(int j=0;j<=1000000;j++) 

sb.append(String.valueOf(j)); 

मुझे परिणाम बहुत जल्दी मिला। ऐसा क्यों हैं?

+0

http://www.joelonsoftware.com/ लेख/fog0000000319.html – moonshadow

+0

क्या मैं आपको प्रभावी जावा पढ़ने के लिए सुझाव देता हूं http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683 इस पुस्तक में जावा प्रोग्रामिंग के बुनियादी ज्ञान शामिल होंगे। यदि आपके पास और सवाल है, तो आप अभी भी यहां वापस जा सकते हैं, बेशक – nanda

+0

यदि आप स्ट्रिंगबफर को पूर्व-आकार देते हैं तो यह तेज़ हो जाएगा: 'स्ट्रिंगबफर एसबी = नया स्ट्रिंगबफर (5888896);' फिर यह * यदि आप 'स्ट्रिंगबिल्डर' में बदल जाते हैं तो थोड़ा * तेज़ फिर से। संयोग से, आप केवल 'sb.append (j) का उपयोग कर सकते हैं;' संख्या को जोड़ने के लिए। स्ट्रिंगबिल्डर के लिए –

उत्तर

6

s+=String.valueOf(j); हर बार इसे कॉल करने पर एक नया String ऑब्जेक्ट आवंटित करने की आवश्यकता है, और यह महंगा है। StringBuffer केवल कुछ आंतरिक प्रतिनिधित्व बढ़ने की आवश्यकता है जब निहित स्ट्रिंग बहुत बड़ी होती है, जो अक्सर कम होती है।

यदि आप StringBuilder का उपयोग करते हैं तो यह शायद तेज़ होगा, जो स्ट्रिंगबफर का एक गैर-सिंक्रनाइज़ संस्करण है। नोट करने के लिए

एक बात यह है कि जब इस छोरों और कई अन्य मामलों पर लागू होता है, यह जरूरी सभी मामलों में जहां तार + का उपयोग कर concatenated रहे हैं पर लागू नहीं होता है:

String helloWorld = getGreeting() + ", " + getUsername() + "!"; 

यहाँ, संकलक शायद अनुकूलित करेंगे कोड जिस तरह से फिट दिखाई देता है, जो StringBuilder बना सकता है या नहीं, क्योंकि यह भी एक महंगा ऑपरेशन है।

+0

+1। आप इसके लिए स्मृति आवंटित कर सकते हैं (कन्स्ट्रक्टर को पैरामीटर)। – Thilo

1

क्योंकि एस + = "स्ट्रिंग" एक नया उदाहरण बनाता है। एक स्ट्रिंग अपरिवर्तनीय है। स्ट्रिंगबफर या स्ट्रिंगबिल्डर एक नया उदाहरण बनाये बिना स्ट्रिंग को जोड़ता है।

1

जावा में .NET स्ट्रिंग्स के रूप में अपरिवर्तनीय हैं। सृजन के बाद उन्हें बदला नहीं जा सकता है। नतीजा यह है कि + ऑपरेटर का उपयोग करके एक नई स्ट्रिंग तैयार होगी और इसमें दोनों स्ट्रिंग्स की सामग्री कॉपी होगी।

एक स्ट्रिंगबफर अक्षर जोड़ने के लिए अंतरिक्ष से बाहर होने पर आवंटित स्थान को दोगुना कर देगा। इस प्रकार स्मृति आवंटन की मात्रा को कम करना।

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