2010-11-16 25 views
13

किसी भी परिदृश्य में स्ट्रिंग शाब्दिक फायदेमंद के खिलाफ एक स्ट्रिंग() कन्स्ट्रक्टर का उपयोग कर रहा है? स्ट्रिंग अक्षर का उपयोग मौजूदा वस्तुओं का पुन: उपयोग करने में सक्षम बनाता है, तो हमें सार्वजनिक निर्माता की आवश्यकता क्यों है? क्या कोई वास्तविक दुनिया उपयोग है? उदाहरण के लिए, दोनों अक्षर एक ही वस्तु को इंगित करते हैं।स्ट्रिंग() कन्स्ट्रक्टर निजी क्यों नहीं है?

String name1 = "name";//new String("name") creates a new object. 
String name2 = "name"; 

उत्तर

18

एक उदाहरण जहां निर्माता एक उपयोगी उद्देश्य होता है: String.substring() द्वारा बनाई स्ट्रिंग्स का हिस्सा String वे द्वारा बनाई रहे हैं के अंतर्निहित char[]। तो अगर आप लंबाई 10.000.000 का एक String (स्मृति के 20MB लेने) है और स्ट्रिंग के रूप में अपनी पहली 5 अक्षर ले तो त्यागने मूल String, कि सबस्ट्रिंग अभी भी 20MB वस्तु कचरा संग्रहण के लिए योग्य होने से रखेंगे। उस पर स्ट्रिंग कन्स्ट्रक्टर का उपयोग करना इससे बच जाएगा, क्योंकि यह अंतर्निहित चार सरणी का केवल एक हिस्सा बनाता है जिसका उपयोग वास्तव में String उदाहरण द्वारा किया जाता है।

बेशक

, यदि आप बना सकते हैं और एक ही String की सबस्ट्रिंग का एक बहुत का उपयोग करें, खासकर अगर वे ओवरलैप है, तो आपको बहुत बहुत उन्हें अंतर्निहित char[], और निर्माता का उपयोग कर विरोधात्मक होगी साझा करना चाहते हैं चाहते हैं।

+0

यह लगभग 5 साल पहले मेरे लिए एक कठिन सबक सीखा था। –

+0

यह एक सुंदर व्याख्यान था लेकिन यह हेडर से प्रश्न का उत्तर नहीं देता: "स्ट्रिंग कन्स्ट्रक्टर * निजी * क्यों नहीं है?" String.subsring() क्लास स्ट्रिंग की विधि के रूप में निजी कन्स्ट्रक्टर का उपयोग करके अपने सभी अनुकूलन को कार्यान्वित कर सकता है। सवाल यह है कि यह कन्स्ट्रक्टर सार्वजनिक क्यों है ?! – AlexR

+1

@AlexR: उत्तर को फिर से पढ़ें, विशेष रूप से पहले पैराग्राफ की अंतिम वाक्य। –

0

क्योंकि कभी-कभी आप एक प्रतिलिपि बनाना चाहते हैं और न केवल एक ही स्ट्रिंग के लिए एक नया संदर्भ है।

+0

क्या आप इस तरह के परिदृश्य का उदाहरण दे सकते हैं? – cdhowie

+3

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

3

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

String longS = "very long"; 
String shortS = new String(longS.substring(4)); 
+0

@Erick: नहीं, जरूरी नहीं है। माइकल के जवाब देखें। –

+0

@Erick: हाँ यह होगा, क्योंकि अंतर्निहित चार सरणी "दृश्यमान" स्ट्रिंग सामग्री से कहीं अधिक बड़ी हो सकती है। –

+0

माइकल ने इसे बेहतर समझाया। –

0

सभी अच्छे यहाँ जवाब है, लेकिन मुझे लगता है कि उनका कहना है कि जावा शाब्दिक काफी अलग से तार परंपरागत तरीके से निर्माण किया व्यवहार करता है लायक है।

यह a good Q/A इसके बारे में है।

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