String s = "hello";
String backup_of_s = s;
s = "bye";
इस बिंदु पर, बैकअप चर में अभी भी मूल मान "हैलो" है (यह स्ट्रिंग के अपरिवर्तनीय अधिकार के कारण है)।
लेकिन क्या इस विधि के साथ स्ट्रिंग्स की नकल करना वास्तव में सुरक्षित है (जो नियमित रूप से उत्परिवर्तित वस्तुओं को कॉपी करने के लिए सुरक्षित नहीं है), या इसे लिखना बेहतर है? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
दूसरे शब्दों में, इन दो स्निपेट के बीच क्या अंतर है (यदि कोई हो)?
EDIT - पहला स्निपेट सुरक्षित होने का कारण:
मुझे पहले से प्रदान किए गए अच्छे उत्तरों के आधार पर चीजों को थोड़ा और विस्तार से समझाएं, (जो अनिवार्य रूप से 2 स्निपेट के बीच प्रदर्शन के अंतर के सवाल पर केंद्रित थे):
जावा में स्ट्रिंग्स अपरिवर्तनीय हैं, जिसका अर्थ है कि इसके निर्माण के बाद एक स्ट्रिंग ऑब्जेक्ट को संशोधित नहीं किया जा सकता है। अत,
String s = "hello";एक नया स्ट्रिंग उदाहरण बनाता है और इसके पते को बताता है s( sउदाहरण / ऑब्जेक्ट का संदर्भ होने के नाते)
String backup_of_s = s;एक नया चर बनाता है backup_of_sऔर इसे इनिशियलाइज़ करता है ताकि यह वर्तमान में संदर्भित ऑब्जेक्ट को संदर्भित करे s।
नोट: स्ट्रिंग अपरिवर्तनीयता गारंटी देती है कि यह ऑब्जेक्ट संशोधित नहीं किया जाएगा: हमारा बैकअप सुरक्षित है
नोट 2: जावा कचरा संग्रहण तंत्र गारंटी देता है कि यह वस्तु तब तक नष्ट नहीं होगी जब तक कि इसे कम से कम एक चर ( backup_of_sइस मामले में) द्वारा संदर्भित किया जाता है
अंत में, s = "bye";एक और स्ट्रिंग उदाहरण बनाता है (अपरिवर्तनीयता के कारण, यह एकमात्र तरीका है), और sचर को संशोधित करता है ताकि यह अब नई वस्तु का संदर्भ दे।