2012-01-22 16 views
22

बनाम संलग्न हो सकता है मैं बंटवारे बाल हूँ, लेकिन मैं निम्नलिखित मामले में सोच रहा था:एक बार फिर स्ट्रिंग पर concat + बनाम

String newString = a + b + c; //case 1 


String newString = a.concat(b).concat(c); //case 2 

StringBuilder newString = new StringBuilder(); //case 3 
newString.append(a); 
newString.append(b);  
newString.append(c); 

कौन सा सबसे अच्छा उपयोग करने के लिए है?

सबसे अच्छा मेरा मतलब है किसी भी तरह

इन के बारे में पढ़ना, अन्य पदों का कहना है कि मामले 3 कि अनुकूलतम प्रदर्शन समझदारी नहीं है, दूसरों को उस मामले 1 मामले 3 आदि में खत्म हो जाएगा

अधिक विशिष्ट होना करने के लिए।

उदा।, सभी तरफ सेट करना, यदि आप अपना कोड बनाए रखना चाहते हैं तो कौन सी शैली इसे अन्य प्रोग्रामर से देखने के लिए अधिक उपयुक्त है?

या आप अधिक प्रोग्रामिंग कुशल के रूप में क्या विचार करेंगे?
या आपको लगता है कि तेज है आदि

मुझे नहीं पता कि यह कैसे व्यक्त किया जाए।

उदा। केस 3 तेजी से हो सकता है लेकिन प्रोग्रामर का विशाल बहुमत केस 1 पसंद करता है क्योंकि यह सबसे ज्यादा पढ़ने योग्य है, अगर यह किसी भी तरह से

+2

मैं downvote.I मन में बहुत कुछ गुमनाम downvote – Cratylus

+0

यह सवाल शायद कुछ अन्य लोगों का एक शिकार है कोई आपत्ति नहीं है। (किसी के रूप में उपरोक्त एक डुप्ली से जुड़ा हुआ है।) –

+0

@Cratylus, इच्छा है कि मैं बार-बार आपकी टिप्पणी को ऊपर उठा सकूं। लेकिन कौन परवाह करता है, तो अज्ञात डाउनवॉट्स के बिना SO नहीं है। – 3bdalla

उत्तर

19

केस 1 संक्षिप्त है, स्पष्ट रूप से आशय व्यक्त करता है, और इस मामले के बराबर है 3.

केस 2 कम कुशल है, और कम पठनीय भी है।

केस 3 लगभग 1, लेकिन लंबे समय तक और कम पठनीय के रूप में लगभग कुशल है।

केस 3 का उपयोग करना केवल एक लूप में संयोजित होने पर उपयोग करना बेहतर होता है। अन्यथा, कंपाइलर केस 1 को केस 3 में संकलित करता है (सिवाय इसके कि स्ट्रिंगबिल्डर को new StringBuilder(a) के साथ बनाता है), जो आपके मामले से भी अधिक कुशल बनाता है 3)।

+2

+1: केस 2 अन्य मामलों की तरह एक अस्थायी वस्तु बनाता है, इसलिए यह मेरे लिए कम कुशल नहीं है, लेकिन यह स्पष्ट होने की संभावना कम से कम सहमत है। (आंशिक रूप से क्योंकि इसका उपयोग करने के लिए कम से कम आम है) –

+0

इसमें 1 अस्थायी वस्तु है (वास्तव में 2 वास्तव में, यदि आप चार सरणी गिनते हैं) क्योंकि वहां केवल 3 तारों को संयोजित करने के लिए हैं। यदि आप अधिक स्ट्रिंग जोड़ते हैं, तो आपके पास प्रति स्ट्रिंग एक और अस्थायी वस्तु होगी। –

+1

सहमत हैं कि यह भी स्केल नहीं करता है। 'A.concat (बी) 'के लिए यह वास्तव में थोड़ा बेहतर है। –

2

केस 3 सबसे अधिक पहलुओं में बेहतर है। 3 मामले में, आप 3 स्ट्रिंग ऑब्जेक्ट्स बनाने का अंत नहीं करते हैं। स्ट्रिंग अपरिवर्तनीयता के कारण, 2 प्रत्येक + (या) कॉन्सट के लिए स्ट्रिंग ऑब्जेक्ट बनाने का ओवरहेड होगा।

संपादित करें: दस्तावेज़ को दोबारा पढ़ें और अधिकांश टिप्पणियों से सहमत हैं, केस 1 केस 3 है।

+0

और आमतौर पर जब आप टेक्स्ट मैनिप्ल्यूशन कर रहे हैं जहां प्रदर्शन महत्वपूर्ण है, तो आप (ए) संचालन की एक बड़ी मात्रा के साथ काम कर रहे हैं; और (बी) अधिक जटिल संचालन जैसे टेक्स्ट खोजना और डालना या हटाना। – user268396

+2

आधुनिक जेवीएम रनटाइम पर केस 1 से केस 3 में कनवर्ट करते हैं, इसलिए 3 स्ट्रिंग ऑब्जेक्ट्स नहीं होंगे। लेकिन अगर बहुत सारे अनुक्रमिक concatenations (विभिन्न कथन में) या एक लूप में हैं, तो हाँ प्रत्येक कथन एक नई अपरिवर्तनीय स्ट्रिंग बनाता है। –

+0

धन्यवाद अमीर! सहमत हैं और मेरा जवाब अपडेट किया गया। – kosa

7

केस 3 सबसे प्रदर्शन रूप है, लेकिन JVM मामले 3.

के मामले 1 धर्मान्तरित लेकिन मेरा मानना ​​है कि मामला 2 सबसे खराब है, यह मामला 1 के रूप में के रूप में पढ़ने योग्य नहीं है और मामले 3 के रूप में के रूप में प्रदर्शन नहीं

यदि आप लूप में स्ट्रिंग को जोड़ना चाहते हैं तो बस केस 3 का उपयोग करें, आप आसानी से प्रदर्शन लाभ का परीक्षण कर सकते हैं, लेकिन यदि यह लूप में नहीं है (या आप अनुक्रम में बहुत सारे तारों को जोड़ नहीं रहे हैं) तो वे हैं लगभग एक जैसा।

मामलों जो आप + ऑपरेटर का उपयोग नहीं करेगा कर रहे हैं:

String a = ""; 
for (String x : theStrings) { 
    a += x; 
} 

या

String a = b + c; 
a = a + d; 
a = a + e; 
a = a + f; 
1

सरल मामलों के लिए, + का उपयोग स्पष्ट रूप से अधिक पठनीय है।

दुर्लभ और अधिक जटिल मामलों के लिए, StringBuilder समझ में आता है। यदि आप लाइनों में विभाजित हैं, तो + जल्दी से प्रदर्शन ड्रैग हो सकता है। लूप्स ओ (एन) प्रदर्शन से ओ (एन^2) तक जाते हैं - एन एक समस्या नहीं है, लेकिन एन अजीब परिस्थितियों में बड़ी हो सकती है (शायद कुछ महत्वपूर्ण करते समय, या जब कोई दुर्भावनापूर्ण है)।

अन्य उत्तर के विपरीत, यदि आप केवल तीन तार मिल गया है, concat प्रदर्शन विजेता हो सकता है। क्या मैं मानसिक हूँ? नहीं। अन्य दो विकल्पों पर विचार करें। आप एक सरणी के साथ StringBuilder ऑब्जेक्ट बना रहे हैं। तारों को जोड़ने के लिए सरणी को प्रतिस्थापित करने की आवश्यकता हो सकती है और आपके पास सरणी के अंत में अजीब बिट्स हो सकते हैं (thefre आवंटन के लिए एक निश्चित ग्रैन्युलरिटी है, इसलिए कुछ अतिरिक्त char एस मेमोरी उपयोग में वृद्धि हो सकती है या नहीं)। यदि आप अपने कोड को पढ़ने वाले हर किसी से नफरत करते हैं तो आप आवश्यक क्षमता की गणना कर सकते हैं। बेस्ट मामले, दो सरणियों (StringBuilder के लिए एक, पिछले आठ सालों से String (कोई साझा करने के लिए एक)) परिणाम पाठ और दो अन्य वस्तुओं (StringBuilder और String) के आकार के प्रत्येक। अब concat के लिए आप String ऑब्जेक्ट्स को दो सरणी के साथ आवंटित करने जा रहे हैं, लेकिन पहली सरणी c.length() कम होगी। यह एक जीत है! खैर, पठनीयता के लिए नहीं।

अस्वीकरण: JVM भागने विश्लेषण और कोर वर्गों के विशेष आवरण के बाद ढेर आवंटन सहित जंगली अनुकूलन, कर सकते हैं। वे हाथ से obfuscated कोड की तुलना में आम और सरल कोड अनुकूलित करने की अधिक संभावना है।

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