2009-12-24 9 views
12

बदल सकता है मैंने पढ़ा है कि जावा में एक प्रकार का ऑब्जेक्ट स्ट्रिंग नहीं बदल सकता है। लेकिन int और char चर कर सकते हैं। क्यों यह है? क्या आप मुझे एक उदाहरण दे सकते हैं?स्ट्रिंग बदल नहीं सकता है। लेकिन int, char

धन्यवाद। (मैं एक नया -_-)

+2

आपका क्या मतलब है, बदल नहीं सकते? आप हमारे बारे में क्या बता रहे हैं इसका एक उदाहरण देते हैं? – user151841

+2

एसओ में आपका स्वागत है। मुझे लगता है कि रचनात्मक उत्तर पाने के लिए आपको थोड़ा और वर्णनात्मक होना होगा। :) –

+9

मुझे नहीं पता कि इन लोगों को एक डाउनवोट क्यों मिलता है। वह एक नौसिखिया है और बस एक सवाल पूछ रहा है। वोट नीचे givieng द्वारा आप उसे निराश कर रहे हैं। और मैं नहीं देख सकता कि सवाल के साथ क्या गलत है, यह एक मान्य है! –

उत्तर

18

जैसा कि bzabhi ने कहा, तार जावा में अपरिवर्तनीय हैं। इसका मतलब है कि एक स्ट्रिंग ऑब्जेक्ट कभी नहीं बदलेगा। इसका मतलब यह नहीं है कि आप स्ट्रिंग चर बदल नहीं सकते हैं, बस आप स्ट्रिंग के अंतर्निहित स्मृति प्रतिनिधित्व को नहीं बदल सकते हैं। उदाहरण के लिए:

String str = "Hello"; 
str += " World!"; 

इन पंक्तियों के निष्पादन के बाद, str स्मृति में एक नई स्ट्रिंग को इंगित करेगा। मूल "हैलो" स्ट्रिंग अभी भी स्मृति में मौजूद है, लेकिन अधिकतर यह लंबे समय तक नहीं रहेगी। यह मानते हुए कि कोई विलुप्त होने वाली परिस्थितियां नहीं हैं, मूल स्ट्रिंग पर कुछ भी इंगित नहीं होगा, इसलिए यह कचरा इकट्ठा होगा।

मुझे लगता है कि यह कहने का सबसे अच्छा तरीका यह होगा कि जब उदाहरण के पंक्ति 2 निष्पादित होते हैं, तो मूल स्ट्रिंग के संयोजन से स्मृति में एक नई स्ट्रिंग बनाई जाती है और स्ट्रिंग को इसमें जोड़ा जा रहा है। स्ट्र वैरिएबल, जो सिर्फ स्मृति स्थान का संदर्भ है, फिर उस नए चर पर इंगित करने के लिए बदल दिया गया है जो अभी बनाया गया था।

मैं मुद्दे पर विशेष रूप से जानकार नहीं हूँ, लेकिन, के रूप में मैं इसे समझते हैं, यह है कि क्या सभी "गैर आदिम" मूल्यों के साथ होता है। ऑब्जेक्ट से प्राप्त कुछ बिंदु पर कुछ भी इन नियमों का पालन करता है। आदिम मूल्य, जैसे कि स्याही, बूल, वर्ण, फ्लोट्स और युगल स्मृति में वास्तविक मान को बदलने की अनुमति देते हैं। तो, यह से:

int num = 5; 
num += 2; 

स्मृति परिवर्तन में वास्तविक मूल्य। एक नई वस्तु बनाने और संदर्भ बदलने के बजाय, यह कोड नमूना संख्या चर के लिए स्मृति में मान को बदल देगा।

क्यों यह सच है के रूप में, यह बस जावा के निर्माताओं द्वारा एक डिजाइन निर्णय है। मुझे यकीन है कि कोई इस पर टिप्पणी करेगा कि यह क्यों बनाया गया था, लेकिन यह मुझे कुछ नहीं पता है।

+0

* क्यों? * मैं बस अनुमान लगा रहा हूं, लेकिन शायद यह इसलिए है क्योंकि यदि आप एक स्ट्रिंग का विस्तार करना चाहते हैं तो आपको स्मृति को फिर से आवंटित करना होगा। वर्णों को व्यवस्थित रूप से संग्रहीत किया जाता है, और निम्नलिखित चार उपयोग के लिए उपलब्ध नहीं हो सकते हैं, इसलिए यह स्मृति के एक नए हिस्से को किसी भी तरह से फिर से आवंटित करता है। – mpen

+0

यानी - यह इस तरह से अधिक कुशल है (ज्यादातर मामलों में)। जब तक आप केवल संभावित उपयोग के लिए विशाल तार आवंटित नहीं करना चाहते हैं। लेकिन स्ट्रिंगबफर के लिए यही है ... – mpen

+0

(मैं 'int' से' इंटीजर 'की तुलना करता हूं - वे बहुत ही समान तरीकों से व्यवहार करते हैं। उदाहरण के लिए,' एटमिक इंटेगर 'और' स्ट्रिंगबिल्डर ',' इंटीजर '/ 'से काफी भिन्न व्यवहार करते हैं। int' और 'स्ट्रिंग'।) –

9

int और char या तो नहीं बदल सकता है। तारों के साथ, आप एक ही वैरिएबल में एक अलग मान डाल सकते हैं, लेकिन एक पूर्णांक स्वयं नहीं बदलता है। 3 हमेशा 3 होगा; आप इसे 4 संशोधित नहीं कर सकते हैं।

3

मुझे यकीन नहीं है कि यह दिखाने के लिए संभव है (उदाहरण के लिए) स्ट्रिंग्स बदल नहीं सकते हैं। लेकिन आप Javadoc for the String class के विवरण खंड को पढ़कर इसकी पुष्टि कर सकते हैं, फिर विधियों अनुभाग को पढ़ सकते हैं और यह नोट कर सकते हैं कि स्ट्रिंग को बदलने वाले कोई भी तरीके नहीं हैं।

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

4

स्ट्रिंग अपरिवर्तनीय प्रकार (के अंदर मूल्य इसे बदल नहीं सकते हैं)। यह सभी आदिम प्रकारों (बूलियन, बाइट, चार, लघु, int, लंबा, फ्लोट, और डबल) के लिए भी सच है।

int x; 
String s; 

x = 1; 
x = 2; 
s = "hello"; 
s = "world"; 
x++; // x = x + 1; 
x--; // x = x - 1; 

आप देख सकते हैं, किसी भी मामले में आप निरंतर मूल्य बदल सकते हैं (1, 2, "हैलो", "दुनिया"), लेकिन आप बदल सकते हैं, जहां वे (ओर इशारा करते हैं, तो आप थोड़ा अपने मन ताना और कहें कि निरंतर int मान पर एक int चर बिंदु)।

2

यह भी ध्यान देने योग्य है कि तारों को अपरिवर्तनीय माना जाता है, क्योंकि यदि वे किसी विधि में पारित होते हैं, तो उन्हें विधि के अंदर संशोधित नहीं किया जा सकता है और फिर उन परिवर्तनों को विधि के दायरे से बाहर देखा जा सकता है।

public void changeIt(String s) { 
    // I can't do anything to s here that changes the value 
    // original string object passed into this method 
} 

public void changeIt(SomeObject o) { 
    // if SomeObject is mutable, I can do things to it that will 
    // be visible outside of this method call 
} 
1

स्ट्रिंग्स java में अडिग हैं। फिर भी, आप अभी भी तारों को मान जोड़ या प्रीपेड कर सकते हैं। मूल्यों से, मेरा मतलब है प्राचीन डेटा प्रकार या अन्य तार।

हालांकि, StringBuffer उत्परिवर्तनीय है, यानी इसे स्मृति में बदला जा सकता है (एक नया मेमोरी ब्लॉक आवंटित नहीं किया जाना चाहिए), जो इसे काफी कुशल बनाता है।

StringBuffer mystringbuffer = new StringBuffer(5000); 

for (int i = 0; i<=1000; i++) 
{ 
    mystringbuffer.append ('Number ' + i + '\n'); 
} 

System.out.print (mystringbuffer); 

एक हजार तार बनाने, हम एक वस्तु (mystringbuffer) है, जो लंबाई में विस्तार कर सकते हैं बनाने के बजाय: इसके अलावा, निम्न उदाहरण पर विचार करें। हम एक अनुशंसित प्रारंभिक आकार भी सेट कर सकते हैं (इस मामले में, 5000 बाइट्स), जिसका अर्थ यह है कि जब बफर को इसमें नई स्ट्रिंग संलग्न होती है तो स्मृति को लगातार स्मृति का अनुरोध नहीं करना पड़ता है।

जबकि StringBuffer प्रत्येक स्थिति में दक्षता में सुधार नहीं करेगा, यदि आपका एप्लिकेशन लंबाई में बढ़ने वाले तारों का उपयोग करता है, तो यह कुशल होगा। कोड StringBuffer एस के साथ भी स्पष्ट हो सकता है, क्योंकि ऐपेंड विधि आपको लंबे असाइनमेंट स्टेटमेंट का उपयोग करने से बचाती है।

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