2010-10-01 16 views
13

मैं कोड इस प्रकार है श्रेणीबद्ध करने के लिए है।यह हमेशा एक बुरा विचार + उपयोग करने के लिए तार

+1

getX() है; एक स्ट्रिंग लौट रहा है? –

+0

मुझे नहीं लगता कि यह 'हमेशा' खराब है। लेकिन अधिकतर अक्सर ऐसे विकल्प नहीं होते हैं जो बेहतर अनुकूल हों। – decompiled

+6

यह निश्चित रूप से + के साथ concatenation का उपयोग करने के लिए _always bad_ नहीं है। हालांकि, जब आप एक लूप कर रहे हैं तो यह बुरा है। – ColinD

उत्तर

21

मैं + का प्रयोग करेंगे, तो आप मैन्युअल रूप से श्रृंखलाबद्ध कर रहे हैं,

String word = "Hello"; 
word += " World!"; 

हालांकि, अगर आप पुनरावृत्ति कर रहे हैं और श्रृंखलाबद्ध मैं StringBuilder,

StringBuilder sb = new StringBuilder(); 
for (My my : myList) { 
    sb.append(my.getX()); 
} 
+7

+1 के बारे में पढ़ने के लिए दूर है - यह एक लूप * में concatenation * है जो आपको आम तौर पर टालना चाहिए। –

+0

एक और बिंदु: वास्तव में कुछ मामलों में + का उपयोग करने के लिए _better_ हो सकता है, यदि स्ट्रिंग अक्षर को संयोजित किया जा रहा है, क्योंकि समेकित अक्षरों की एक श्रृंखला को एक स्ट्रिंग के रूप में संकलित किया जाएगा। मैं सकारात्मक नहीं हूं, जिस तरह से यह कई लाइनों पर विभाजित है, लेकिन मुझे लगता है कि संकलक इसे 'स्ट्रिंग शब्द =' हैलो वर्ल्ड! 'के अनुकूलन करेगा। – ColinD

+0

इस तरह के कॉन्सटेनेशन का उपयोग करना ठीक है, अगर आपको यकीन है कि कभी भी आपका एप्लिकेशन स्थानीयकृत नहीं होगा। यदि आप इसे विदेशी भाषा में अनुवाद करने की योजना बना रहे हैं, तो आप स्थानीयकरण दोष के साथ समाप्त हो जाएंगे। –

8

स्ट्रिंग ऑब्जेक्ट जावा में अपरिवर्तनीय है। प्रत्येक + का मतलब एक और वस्तु है। आप बनाए गए ऑब्जेक्ट्स की मात्रा को कम करने के लिए स्ट्रिंगबफर का उपयोग कर सकते हैं।

+7

जावा 'स्ट्रिंगबिल्डर' का उपयोग करने के लिए + के साथ concatenation का अनुवाद करता है। यदि आप विधि कॉल या किसी ऐसे श्रृंखला का उपयोग करके स्ट्रिंग लूपिंग या स्ट्रिंग बना रहे हैं तो आपको केवल 'स्ट्रिंगबिल्डर' का उपयोग करने की आवश्यकता है। इसके अलावा, 'स्ट्रिंगबफर' में थ्रेड सुरक्षा ओवरहेड है जिसे आपको आमतौर पर आवश्यकता नहीं होती है, इसलिए 'स्ट्रिंगबिल्डर' आमतौर पर बेहतर विकल्प होता है। – ColinD

+5

_Tony scurries StringBuilder_ –

3

संकलक ऐसे

के रूप में कुछ बात अनुकूलन कर सकते हैं सुझाव है कि

"foo" + "bar"

से

स्ट्रिंगबिल्डर एस 1 = नया स्ट्रिंगबिल्डर(); s1.append ("foo")। संलग्न करें ("बार");

हालांकि यह अभी भी उप-शीर्ष है क्योंकि यह 16 के डिफ़ॉल्ट आकार से शुरू होता है। कई चीजों के साथ ही आपको अपनी सबसे बड़ी बोतल गर्दन मिलनी चाहिए और सूची में अपना रास्ता बनाना चाहिए। हालांकि, एसबी पैटर्न का उपयोग करने के खरगोश में होने के बावजूद यह चोट नहीं पहुंचाता है, खासकर यदि आप इष्टतम प्रारंभिक आकार की गणना करने में सक्षम हैं।

+0

असल में * कंपाइलर * बाधा खोजने के लिए इसे "foobar" '... में अनुकूलित कर सकता है –

3

समयपूर्व अनुकूलन खराब हो सकता है साथ ही यह अक्सर पठनीयता को कम करता है और आमतौर पर पूरी तरह से अनावश्यक होता है। + का उपयोग करें यदि यह अधिक पठनीय है जब तक कि वास्तव में आपके पास ओवरराइडिंग चिंता न हो।

3

यह "+" का उपयोग करने के लिए 'हमेशा खराब' नहीं है। हर जगह स्ट्रिंगबफर का उपयोग करके कोड वास्तव में भारी हो सकता है।

यदि कोई गहन, समय-महत्वपूर्ण पाश के बीच में बहुत अधिक "+" डालता है, तो मैं नाराज हूं। अगर कोई कोड के शायद ही कभी इस्तेमाल किए गए टुकड़े में बहुत "+" डालता है तो मुझे परवाह नहीं है।

1

मैं कहूंगा कि उपयोग के साथ निम्न में:

String c = "a" + "b"

और अन्य सभी स्थानों StringBuilder वर्ग का उपयोग करें। जैसा कि पहले मामले में पहले से ही उल्लेख किया गया है, इसे संकलक द्वारा अनुकूलित किया जाएगा और यह अधिक पठनीय है।

4

हर बार जब आप string+=string करते हैं, इसे इस तरह प्रणाली को बुलाती है:

final void append0(String string) { 
    if (string == null) { 
     appendNull(); 
     return; 
    } 
    int adding = string.length(); 
    int newSize = count + adding; 
    if (newSize > value.length) { 
     enlargeBuffer(newSize); 
    } 
    string.getChars(0, adding, value, count); 
    count = newSize; 
} 

आप स्पष्ट रूप से निष्कर्ष निकाल सकते हैं के रूप में, string + string का एक बहुत बनाता है:

private String(String s1, String s2) { 
    if (s1 == null) { 
     s1 = "null"; 
    } 
    if (s2 == null) { 
     s2 = "null"; 
    } 
    count = s1.count + s2.count; 
    value = new char[count]; 
    offset = 0; 
    System.arraycopy(s1.value, s1.offset, value, 0, s1.count); 
    System.arraycopy(s2.value, s2.offset, value, s1.count, s2.count); 
} 

StringBuilder के मामले में, यह करने के लिए आता ओवरहेड, और यदि संभव हो तो मेरी राय से बचा जाना चाहिए।

public static String scat(String... vargs) { 
    StringBuilder sb = new StringBuilder(); 

    for (String str : vargs) 
     sb.append(str); 

    return sb.toString(); 
} 

और इसका इस्तेमाल चाहते:

String abcd = scat("a","b","c","d"); 

सी # में मैं अपने बारे में बताया करती हूं कि आप का उपयोग कर StringBuilder भारी है या लंबे समय के लिए आप सिर्फ एक विधि बनाने के लिए और यह परोक्ष रूप से उपयोग करते हैं, की तरह कर सकते हैं लगता है string.Concat(); के समान।

public static String scat(Collection<?> vargs) { 
    StringBuilder sb = new StringBuilder(); 

    for (Object str : vargs) 
     sb.append(str); 

    return sb.toString(); 
} 

तो फिर तुम इसके साथ कॉल कर सकते हैं: आपके मामले में यह गोबर के लिए अधिभार लिखने के लिए, की तरह बुद्धिमान होगा

result = scat(myList) 
1

वजहों FindBugs संयोजन ऑपरेटर का उपयोग के बारे में लोगों का तर्क है चाहिए में से एक (होना यह "+" या "+ =") स्थानीयकरण योग्यता है। उदाहरण में आप यह इतना स्पष्ट नहीं है दे दी है, लेकिन निम्न कोड के मामले में यह है:

String result = "Scanning found " + Integer.toString(numberOfViruses) + " viruses"; 

यह कुछ हद तक परिचित लग रहा है, तो आप अपने कोडिंग शैली को बदलने की जरूरत है। समस्या यह है कि यह अंग्रेजी में बहुत अच्छा लगेगा, लेकिन यह अनुवादकों के लिए एक दुःस्वप्न हो सकता है। ऐसा इसलिए है क्योंकि आप इस बात की गारंटी नहीं दे सकते कि वाक्य के आदेश अभी भी अनुवाद के बाद ही होंगे - कुछ भाषाओं का अनुवाद "1 ब्ला ब्लाह" में किया जाएगा, कुछ "ब्ला ब्ला 3" के लिए। ऐसे मामलों में आपको हमेशा compound वाक्यों को बनाने के लिए MessageFormat.format() का उपयोग करना चाहिए और concatenation ऑपरेटर का उपयोग स्पष्ट रूप से अंतरराष्ट्रीयकरण बग है।

बीटीडब्ल्यू। मैंने यहां एक और i18n दोष डाला, क्या आप इसे खोज सकते हैं?

0

दो तारों के संयोजन के चलने का समय स्ट्रिंग की लंबाई के समान है। यदि इसका उपयोग लूप रनिंग टाइम में किया जाता है तो हमेशा बढ़ रहा है। तो यदि लूप में संगतता की आवश्यकता है तो StringBuilder का उपयोग करना बेहतर है जैसे एंथनी ने सुझाव दिया।

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