2011-01-10 18 views
289

जावा में स्ट्रिंग कॉन्सटेनेशन के लिए आमतौर पर StringBuilder का उपयोग करना बेहतर माना जाता है। क्या यह हमेशा मामला है?जावा में स्ट्रिंगबिल्डर का उपयोग कब करें

यह क्या मेरा मतलब है: है, एक StringBuilder वस्तु बनाने append() विधि बुला और अंत में toString() पहले से ही छोटे दो स्ट्रिंग्स के लिए + ऑपरेटर के साथ मौजूदा तार श्रृंखलाबद्ध तो, या इसे और अधिक के लिए केवल सलाह दी जाती है की भूमि के ऊपर (दो से) तार?

यदि ऐसी कोई सीमा है, तो यह किस पर निर्भर करता है (शायद स्ट्रिंग लंबाई, लेकिन किस तरह से)?

और आखिरकार, क्या आप + के StringBuilder के प्रदर्शन के लिए दो, तीन या चार तारों के प्रदर्शन के लिए पठनीयता और समन्वय का व्यापार करेंगे?

नियमित संगतता के लिए StringBuilder का स्पष्ट उपयोग obsolete Java optimization tips पर अप्रचलित के रूप में और Java urban myths पर अप्रचलित के रूप में वर्णित किया जा रहा है।

+0

विस्तृत ब्लॉग के लिए इस ब्लॉग पोस्ट को देखें: http: //www.rationaljava.com/2015/02/the-optimum-method-to-concatenate.html – Dan

उत्तर

398

आप एक पाश में स्ट्रिंग संयोजन, कुछ इस तरह उपयोग करते हैं,

String s = ""; 
for (int i = 0; i < 100; i++) { 
    s += ", " + i; 
} 

तो आप का उपयोग करना चाहिए एक StringBuilder (नहीं StringBuffer) एक String के बजाय, क्योंकि यह बहुत तेजी से और कम स्मृति खपत करता है।

आप एक ही बयान है, तो

String s = "1, " + "2, " + "3, " + "4, " ...; 

तो आप String रों उपयोग कर सकते हैं, क्योंकि संकलक StringBuilder स्वचालित रूप से प्रयोग करेंगे।

+11

धन्यवाद, राल्फ। लघु, सटीक (और उदाहरण हैं) – kostja

+24

दरअसल, आजकल मैं वास्तव में स्ट्रिंग्स की तुलना में लगभग किसी और चीज का उपयोग नहीं करता। मैं इनके लिए वकालत करता था, लेकिन जेवीएम की प्रगति के साथ यह लगभग ** ** ज़रूरी नहीं है, सौभाग्य से। यदि आप उपरोक्त के लिए बाइटकोड देखें (कम से कम एक जेडीके> 1.6u22 के साथ), तो आप देखेंगे कि सब कुछ एक स्ट्रिंगबिल्डर द्वारा प्रतिस्थापित किया गया है। यह अब केवल एक ही बयान नहीं है, बल्कि वास्तव में काफी जटिल संरचनाएं हैं। मैंने वास्तविक जीवन कोड पर कई परीक्षण मामले किए हैं, और मुझे वास्तव में कोई ऐसी स्थिति नहीं मिलती है जहां यह आंतरिक रूप से स्ट्रिंगबिल्डर का उपयोग नहीं करती है। काफी अच्छा। – haylem

+84

@ हेलम: क्या आप शर्मिंदा हैं? - मैंने संस्करण 1.6.0.21 के साथ इसकी जांच की है, और निश्चित रूप से स्ट्रिंग लूप एक स्ट्रिंग बिल्डर का उपयोग करता है, लेकिन ** केवल ** (एस + = "," + i;) को संयोजित करने के लिए - तो ** यह एक नया बनाता है प्रत्येक पाश के लिए स्ट्रिंग बिल्डर! ** - इसलिए यह एक स्ट्रिंगबिल्डर का उपयोग करने से बहुत धीमा है, जो लूप के बाहर एक बार बनाया गया है और लूप के भीतर ही इसकी संलग्न विधि लागू की जाती है। – Ralph

2

माइक्रोसॉफ्ट प्रमाणन सामग्री इसी प्रश्न को संबोधित करती है। .NET दुनिया में, स्ट्रिंगबिल्डर ऑब्जेक्ट के लिए ओवरहेड 2 स्ट्रिंग ऑब्जेक्ट्स का अधिक सरल संयोजन बनाता है। मैं जावा तारों के लिए एक समान जवाब मानता हूं।

+0

मुझे लगता है कि प्रदर्शन प्रभाव को संकलक अनुकूलन द्वारा कम किया जाता है जावा, या प्रमाणीकरण सामग्री एक प्रभावी अंतर का मतलब है? – kostja

+0

सामग्री स्पष्ट रूप से बताती है कि स्ट्रिंगबिल्डर का उपयोग करके 1 या 2 संगतता (क्रमशः 2 या 3 तार) के मामले में, कम कुशल कार्यान्वयन है। –

+0

तब जावा से अलग दिखता है। वैसे भी धन्यवाद – kostja

7

पर एक नज़र डालें: अपने वातावरण में http://www.javaspecialists.eu/archive/Issue068.html और http://www.javaspecialists.eu/archive/Issue105.html

क्या एक ही परीक्षण और देखें कि क्या नए JDK या अपने जावा कार्यान्वयन String या StringBuilder के साथ बेहतर के साथ बेहतर स्ट्रिंग आपरेशन के कुछ प्रकार है।

32

एक सामान्य नियम के रूप में, हमेशा अधिक पठनीय कोड का उपयोग करें और प्रदर्शन एक मुद्दा होने पर केवल रिफैक्टर का उपयोग करें। इस विशिष्ट मामले में, हाल ही में जेडीके वास्तव में कोड को किसी भी मामले में स्ट्रिंगबिल्डर संस्करण में अनुकूलित करेगा।

यदि आप लूप में स्ट्रिंग कॉन्सटेनेशन कर रहे हैं या कुछ जटिल कोड में संकलक आसानी से अनुकूलित नहीं कर सकते हैं तो आपको आमतौर पर इसे मैन्युअल रूप से करने की आवश्यकता होती है।

3

स्ट्रिंग concatenation के साथ समस्या यह है कि यह सभी संबंधित लागत के साथ स्ट्रिंग ऑब्जेक्ट की प्रतिलिपि बनाता है। स्ट्रिंगबिल्डर थ्रेडसेफ नहीं है और इसलिए स्ट्रिंगबफर से तेज़ है, जो जावा 5 से पहले पसंदीदा विकल्प होता था। अंगूठे के नियम के रूप में, आपको लूप में स्ट्रिंग कॉन्सटेनेशन नहीं करना चाहिए, जिसे अक्सर कहा जाता है। मुझे लगता है कि यहां कुछ कॉन्सटेनेशन कर रहे हैं और जब तक आप सैकड़ों के बारे में बात नहीं कर रहे हैं तब तक आपको चोट नहीं पहुंचीगी और यह निश्चित रूप से आपकी प्रदर्शन आवश्यकताओं पर निर्भर करता है। यदि आप वास्तविक समय की चीज़ें कर रहे हैं, तो आपको बहुत सावधान रहना चाहिए।

4

+ ऑपरेटर आंतरिक रूप से public String concat(String str) का उपयोग करता है। यह विधि दो तारों के पात्रों की प्रतिलिपि बनाता है, इसलिए इसमें दो तारों की लंबाई के लिए आनुपातिक स्मृति आवश्यकताएं और रनटाइम जटिलता होती है। स्ट्रिंगबिल्डर अधिक प्रभावशाली काम करता है।

हालांकि मैंने here पढ़ा है कि + ऑपरेटर का उपयोग करने वाले संगतता कोड को जावा 4 कंपाइलर पर स्ट्रिंगबिल्डर में बदल दिया गया है। तो यह बिल्कुल कोई मुद्दा नहीं हो सकता है। (हालांकि मैं वास्तव में इस कथन की जांच करता हूं अगर मैं अपने कोड में इस पर निर्भर करता हूं!)

45

राल्फ का जवाब शानदार है। मैं स्ट्रिंगबिल्डर वर्ग का उपयोग स्ट्रिंग बनाने/सजाने के लिए करता हूं क्योंकि इसका उपयोग बिल्डर पैटर्न की तरह दिखता है।

public String decorateTheString(String orgStr){ 
      StringBuilder builder = new StringBuilder(); 
      builder.append(orgStr); 
      builder.deleteCharAt(orgStr.length()-1); 
      builder.insert(0,builder.hashCode()); 
      return builder.toString(); 
} 

यह एक सहायक/बिल्डर स्ट्रिंग, नहीं स्ट्रिंग ही निर्माण करने के लिए के रूप में इस्तेमाल हो सकता है।

+1

मुझे नहीं लगता स्ट्रिंगबिल्डर का बिल्डर पैटर्न से कोई संबंध है। नाम-मिलान संयोग AFAIK द्वारा है। – nanosoft

4

दो स्ट्रिंग के लिए concat, तेजी से होता है अन्य मामलों में StringBuilder एक बेहतर विकल्प है, concatenation operator (+) vs concat()

5

में मेरा विवरण देखने के कुछ compilers StringBuilder समकक्ष के साथ किसी भी स्ट्रिंग concatenations की जगह नहीं हो सकती है। संकलन समय अनुकूलन पर भरोसा करने से पहले आपके स्रोत का उपयोग करने वाले कौन से कंपाइलर्स का उपयोग करना सुनिश्चित करें।

+1

दिलचस्प, मुझे इसके बारे में पता नहीं था। क्या आप प्रदान कर सकते हैं एक संदर्भ जिसके लिए कंपाइलर्स concatenation की जगह लेते हैं और जो नहीं? – kostja

+0

नहीं, मेरे पास वह जानकारी नहीं है। मैं सिर्फ संकलन समय अनुकूलन पर भरोसा रखने के लिए कह रहा हूँ। यदि आप सकारात्मक हैं तो सभी कंपाइलर्स आपको कुछ अनुकूलन प्रदान करने की ज़रूरत है, बढ़िया! यदि नहीं, तो यह मानना ​​बेहतर होगा कि वे नहीं करते हैं। लेकिन सबसे महत्वपूर्ण बात यह है कि ऑप्टिमाइज़ेशन की आवश्यकता केवल अनुकूलित करें। –

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