2011-07-13 30 views
6

चूंकि जावा में स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए मैंने स्ट्रिंग्स को संयोजित करने के लिए हमेशा स्ट्रिंगबिल्डर या स्ट्रिंगबफर का उपयोग किया है। क्या String.format() विधि इस समस्या के साथ-साथ स्ट्रिंगबिल्डर या स्ट्रिंगबफर को संभालती है? दूसरे शब्दों में, क्या स्ट्रिंग.फॉर्मैट() मेमोरी के साथ-साथ स्ट्रिंगबफर या स्ट्रिंगबिल्डर का प्रबंधन करता है?जावा में, स्ट्रिंग्सफॉर्मैट() के कार्यान्वयन में विचार की गई स्ट्रिंग्स की अपरिवर्तनीयता है?

+9

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

उत्तर

4

ओरेकल JDK के स्रोत कोड के आधार पर यह कार्यान्वयन प्रत्येक String#format कॉल जो बदले में प्रत्येक कॉल के लिए एक ताजा StringBuilder आवंटित के लिए एक नया Formatter बनाता है कि लगता है। तो हाँ। लेकिन जैसा कि आपके प्रश्न पर टिप्पणी के अनुसार उल्लेख किया गया है, यह बहुत अधिक कार्यान्वयन विशिष्ट है, हालांकि सामान्य ज्ञान यह है कि यह चीजों को करने का सबसे प्रभावी तरीका चुनता है।

+0

दिलचस्प, धन्यवाद! तो एक फॉलो-अप के रूप में, चूंकि स्ट्रिंगबिल्डर थ्रेड-सुरक्षित नहीं है, इसलिए मुझे लगता है कि स्ट्रिंग.फॉर्मैट() थ्रेड-सुरक्षित भी नहीं है ... कम से कम ओरेकल कार्यान्वयन? – fooMonster

+1

यदि प्रारूप में प्रत्येक कॉल एक नया स्ट्रिंगबिल्डर बनाता है और इसे विधि में स्थानीय रखता है, तो प्रारूप में कॉल अभी भी थ्रेड सुरक्षित हो सकता है। –

+0

@ माइकल "अभी भी धागा सुरक्षित हो सकता है"? ऐसा लगता है कि आप यह कह रहे हैं कि डेवलपर स्ट्रिंग.फॉर्मैट() को थ्रेड-सुरक्षित तरीके से कॉल करके इसे थ्रेड-सुरक्षित बना सकता है। स्पष्ट रूप से। शायद मैं स्पष्ट नहीं हो रहा हूँ। अनुवर्ती, साथ ही साथ मूल प्रश्न String.format() के कार्यान्वयन के संबंध में था। तो मेरा फॉलोअप बेहतर होगा क्योंकि "स्ट्रिंग.फॉर्मैट() के कार्यान्वयन के बाद ऑरैक कार्यान्वयन में स्ट्रिंगबिल्डर पर निर्भर करता है, और चूंकि हम जानते हैं कि स्ट्रिंगबिल्डर थ्रेड-सुरक्षित नहीं है, इसका मतलब यह है कि स्ट्रिंग.फॉर्मैट() का कार्यान्वयन ओरेकल के जेडीके में थ्रेड-सुरक्षित भी नहीं है? " – fooMonster