2009-08-18 4 views
30

मान लीजिए मैं इस तरह के रूप में जावा में एक अभिव्यक्ति है:क्या होता है जब जावा कंपाइलर एक पंक्ति में कई स्ट्रिंग concatenations देखता है?

String s = "abc" + methodReturningAString() + "ghi" + 
       anotherMethodReturningAString() + "omn" + "blablabla"; 

क्या जावा के डिफ़ॉल्ट JDK संकलक का व्यवहार है? क्या यह सिर्फ पांच concatenations बनाता है या एक स्मार्ट प्रदर्शन चाल है?

String s = new StringBuilder("abc") 
      .append(methodReturningAString()) 
      .append("ghi") 
      .append(anotherMethodReturningAString()) 
      .append("omn") 
      .append("blablabla") 
      .toString(); 

यह बहुत चालाक स्थिर तार पूर्व श्रेणीबद्ध करना है (यानी "omn" + "blablabla"):

उत्तर

40

यह के बराबर उत्पन्न करता है। यदि आप चाहें तो StringBuilder "प्रदर्शन चाल" का उपयोग कर सकते हैं। प्रदर्शन के लिए यह निश्चित रूप से बेहतर है कि पांच कॉन्सटेनेशन करने के परिणामस्वरूप चार अनावश्यक अस्थायी तार होते हैं। इसके अलावा, स्ट्रिंगबिल्डर का उपयोग जावा 5 में एक प्रदर्शन सुधार था (मुझे लगता है); इससे पहले, स्ट्रिंगबफर का इस्तेमाल किया गया था।

संपादित करें: जैसा कि टिप्पणियों में बताया गया है, स्थिर तार केवल संयोग की शुरुआत में ही पूर्व-संयोजित हैं। अन्यथा करना ऑर्डर-ऑफ-ऑपरेशंस तोड़ देगा (हालांकि इस मामले में मुझे लगता है कि सूर्य इसे औचित्य दे सकता है)। तो यह दिया:

String s = "abc" + "def" + foo() + "uvw" + "xyz"; 

इसे इस तरह तैयार की जाएगी:

String s = new StringBuilder("abcdef") 
      .append(foo()) 
      .append("uvw") 
      .append("xyz") 
      .toString(); 
+0

+1। मैंने स्ट्रिंगबिल्डर को देखा और जब तक मैं नीचे नहीं आया तब तक एक स्पष्टीकरण पोस्ट करने के लिए तैयार था और पाया कि आप इसकी देखभाल कर चुके हैं। –

+0

हां, मुझे याद नहीं आया कि कौन सा सही था, मुझे अपने शुरुआती संशोधन – Kip

+0

के बाद इसे देखना था, असल में, मैं स्ट्रिंग अक्षर के संगतता का जिक्र कर रहा था। पहली नज़र में, मैंने सोचा था कि आप प्रत्येक स्ट्रिंग के लिए '.append' का उपयोग करेंगे। –

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