2013-08-26 11 views
26

शुद्ध स्ट्रिंग concatenation पर एक स्ट्रिंग बिल्डर का उपयोग करने का लाभ और व्यापार बंद क्या है?स्ट्रिंग बिल्डर बनाम स्ट्रिंग concatenation

new StringBuilder(32).append(str1) 
        .append(" test: ") 
        .append(val) 
        .append(" is changed") 
        .toString(); 

बनाम कहना

str1 + " test: " + val + " is changed". 

str1 एक यादृच्छिक 10 चरित्र स्ट्रिंग है। str2 एक यादृच्छिक 8 वर्ण स्ट्रिंग है।

+0

आपके मामूली उदाहरण में, कोई लाभ नहीं हो सकता है। स्ट्रिंगबिल्डर उपयोगी हैं क्योंकि, जब आप + के साथ मिलते हैं तो आप हर बार ब्रांड नए स्ट्रिंग बनाते हैं। स्ट्रिंगबिल्डर बड़ी संख्या में तारों को संगत करने के लिए अधिक कुशल है। –

उत्तर

49

आपके छोटे उदाहरण में, कोई भी नहीं क्योंकि संकलक स्ट्रिंग concatenation करने के लिए StringBuilder का उपयोग करता है। यदि एक लूप में समामेलन हुआ, हालांकि, कंपाइलर कई StringBuilder और String ऑब्जेक्ट्स बना सकता है। उदाहरण के लिए:

String s= "" ; 
for(int i= 0 ; i < 10 ; i++) 
    s+= "a" ; 

हर बार ऊपर लाइन 3 निष्पादित किया जाता है, एक StringBuilder वस्तु बन जाता है, s की सामग्री को संलग्न, "एक" संलग्न है, और फिर StringBuilder एक स्ट्रिंग में s वापस करने के लिए सौंपा जा में बदल जाती है । कुल 10 StringBuilder एस और 10 String एस।

इसके विपरीत,

StringBuilder sb= new StringBuilder() ; 
for(int i= 0 ; i < 10 ; i++) 
    sb.append("a"); 
String s= sb.toString() ; 

में केवल 1 StringBuilder और 1 String बनाई गई हैं।

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

4

त्वरित जवाब प्रदर्शन है: जब आप देशी स्ट्रिंग वर्गों का उपयोग यह अपरिवर्तनीय तार चल रही है, जिसका मतलब है कि जब आप

String line = "java"; 
    String sufix = " is awesome"; 
    line = line + sufix; 

लिख रहे हैं यह दो तार "जावा" बना सकते हैं और कर रहे हैं "भयानक है" , पिछले दो ("जावा" और "कमाल") से एक नई तीसरी स्ट्रिंग "जावा अद्भुत है" बनाने के बाद, जिसे बाद में कचरा कलेक्टर द्वारा हटाया जाने की संभावना है (क्योंकि वे अब ऐप में उपयोग नहीं किए जाते हैं)। यह एक धीमा समाधान है।

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

यदि आप एकल थ्रेड-एप्लिकेशन लिख रहे हैं (कोई समरूपता समस्या नहीं है जिसके दौरान एकाधिक थ्रेड एक ही ऑब्जेक्ट तक पहुंचते हैं) तो स्ट्रिंगबिल्डर को लागू करना बेहतर होता है जिसमें शुरुआती स्ट्रिंगबफर वर्ग की तुलना में तेज़ी से प्रदर्शन होता है।

+0

हाय, थ्रेड सुरक्षित डेटा संरचनाओं की तरह, आप बहु थ्रेड निष्पादन में स्ट्रिंग बिल्डर के थ्रेड सुरक्षित संस्करण का उपयोग करने का सुझाव देते हैं? – nmxprime

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