जावा में सभी तर्क मूल्य द्वारा पारित किए जाते हैं। जब आप String
किसी फ़ंक्शन को पास करते हैं, तो जो मान पास होता है है वह स्ट्रिंग ऑब्जेक्ट का संदर्भ है, लेकिन आप उस संदर्भ को संशोधित नहीं कर सकते हैं, और अंतर्निहित स्ट्रिंग ऑब्जेक्ट अपरिवर्तनीय है।
काम
zText += foo;
के बराबर है:
zText = new String(zText + "foo");
यही है, यह (स्थानीय रूप से) zText
एक नए संदर्भ के रूप में पैरामीटर को पुन: असाइन करता है , जो एक नए मेमोरी लोकेशन की ओर इशारा करता है, जिसमें एक नया String
है जिसमें संलग्न की मूल सामग्री zText
होती "foo"
है।
मूल ऑब्जेक्ट को संशोधित नहीं किया गया है, और main()
विधि का स्थानीय चर zText
अभी भी मूल (खाली) स्ट्रिंग को इंगित करता है।
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
प्रिंट:
Original value:
Local value: foo
Final value:
यदि आप स्ट्रिंग को संशोधित करना चाहते हैं, तो आप नोट किए गए उपयोग के रूप में StringBuilder
या फिर कुछ कंटेनर (एक सरणी AtomicReference
या एक कस्टम कंटेनर क्लास) का उल्लेख कर सकते हैं जो आपको सूचक स्तर का एक अतिरिक्त स्तर प्रदान करता है। वैकल्पिक रूप से, बस नया मान लौटाएँ और इसे असाइन करें:
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
प्रिंट:
Original value:
Local value: foo
Final value: foo
यह संभवतः सामान्य मामले में सबसे जावा-जैसा समाधान है - प्रभावी जावा आइटम "अनुकूल अपरिवर्तनीयता" देखें।
जैसा कि उल्लेख किया गया है, हालांकि, StringBuilder
अक्सर आपको बेहतर प्रदर्शन देगा - यदि आपके पास करने के लिए बहुत कुछ है, खासकर एक लूप के अंदर, उपयोग करें StringBuilder
।
लेकिन यदि आप कर सकते हैं, तो आप के Strings
बजाय अपरिवर्तनीय के आसपास से गुजरने की कोशिश करें StringBuilders
- आपका कोड पढ़ने में आसान होगा और अधिक रखरखाव योग्य होगा। अपने पैरामीटर बनाने पर विचार करें final
, और जब आप किसी नए मान के लिए विधि पैरामीटर को पुन: असाइन करते हैं, तो आपको चेतावनी देने के लिए अपने IDE को कॉन्फ़िगर करें।