2010-08-03 13 views
6
String s = ...; 

s = s.substring(1); 

क्या यह संभव है? मैंने सोचा कि आप जावा में एक स्ट्रिंग ऑब्जेक्ट नहीं बदल सकते हैं।जावा में स्ट्रिंग ऑब्जेक्ट्स अपरिवर्तनीय नहीं हैं?

+1

यदि आप 's.substring (1) 'स्ट्रिंग को' s' में बदल देंगे तो आप सही होंगे। लेकिन आप 's' के लिए एक नई स्ट्रिंग असाइन कर रहे हैं। –

+1

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

+6

वस्तुओं के संदर्भों को भ्रमित न करें। वस्तुएं उत्परिवर्तनीय या अपरिवर्तनीय हो सकती हैं। संदर्भ 'अंतिम' हो सकते हैं या नहीं। एक संदर्भ 'अंतिम' बनाना वस्तु को अपरिवर्तनीय नहीं बनाता है। अपरिवर्तनीय वस्तुओं को संदर्भों द्वारा संदर्भित किया जा सकता है जिन्हें 'अंतिम' नहीं होना चाहिए। – polygenelubricants

उत्तर

23

स्ट्रिंग ऑब्जेक्ट्स अपरिवर्तनीय हैं। स्ट्रिंग संदर्भ, हालांकि, उत्परिवर्तनीय हैं। ऊपर, s एक संदर्भ है।

+1

+1 छोटा और सही। एस का शुरुआती मूल्य अभी भी वहां है, अपरिवर्तित और संभवतः अब अपरिवर्तित, स्मृति में - जीसीएड प्राप्त करने का इंतजार कर रहा है। हालांकि, संदर्भ अब एक नई, इसी तरह अपरिवर्तनीय वस्तु को इंगित करता है, जो सबस्ट्रिंग विधि द्वारा बनाया गया है। – delnan

+3

डांग, मेरी इच्छा है कि मैं आपको अपने क्यू को आसान प्रतिनिधि का एक गुच्छा प्राप्त करने से पहले देख सकूं। :) +1 – iandisme

2

यहां आप एक नई स्ट्रिंग बना रहे हैं और इसे प्री-प्रयुक्त संदर्भ में असाइन कर रहे हैं। मूल स्ट्रिंग जिसे संदर्भित किया गया है कचरा इकट्ठा किया जाता है। वास्तव में कोई तार नहीं बदला।

+0

कचरा इकट्ठा ?? –

4

स्ट्रिंग ऑब्जेक्ट्स अपरिवर्तनीय हैं, जिसका अर्थ है कि उदाहरण का मान s द्वारा संदर्भित नहीं किया जा सकता है।

आपका कोड उदाहरण को म्यूटेट नहीं करता है।
इसके बजाय, यह एक नए स्ट्रिंग उदाहरण के संदर्भ में s संदर्भ बदलता है।

उदाहरण के लिए:

String a = "1"; 
String b = a; 
a = "2"; 

इस कोड को क्रियान्वित करने के बाद, b अभी भी "1" है।
लाइन b = ab सेट "1" उदाहरण के लिए a वर्तमान में संदर्भित करता है।
जब आप बाद में a = "2" लिखते हैं, तो आप एक अलग ("2") उदाहरण के संदर्भ में a चर बदल रहे हैं।
हालांकि, मूल "1" उदाहरण, जो b अभी भी संदर्भित करता है, बदल नहीं गया है।

4

हां, String ऑब्जेक्ट्स अपरिवर्तनीय हैं।

परिवर्तनीय s किसी ऑब्जेक्ट का संदर्भ है, और संदर्भ में वह वस्तु हो सकती है जो इसे बदलने के लिए इंगित करती है - संदर्भ को पुन: असाइन करने से उस ऑब्जेक्ट को प्रभावित नहीं होता है जो इससे इंगित करता है।

String.substring विधि वास्तव में String का एक नया उदाहरण लौटा रही है, इसलिए मूल String ऑब्जेक्ट को छूटा नहीं गया है।

निम्नलिखित दिखाने के लिए कि मूल Stringsubstring विधि ::

String s = "Hello!"; 
s.substring(1); 

System.out.println(s); // Prints "Hello!" 

ऊपर के उदाहरण प्रिंट होगा उसमें कोई परिवर्तन नहीं किया गया है एक सरल उदाहरण है "हैलो!" क्योंकि substring विधि वापसी मूल को प्रभावित करने के बजाय एक नया String होगा। मूल String को बदला नहीं जा सकता क्योंकि यह अपरिवर्तनीय है।

निम्नलिखित के साथ ऊपर की तुलना करें:

String s = "Hello!"; 
s = s.substring(1); 

System.out.println(s); // Prints "ello!" 

इस उदाहरण में, s के संदर्भ Stringsubstring विधि द्वारा वापस करने के लिए बदल गया है, इसलिए जब Strings के साथ जुड़े `सिस्टम द्वारा मुद्रित किया जाता है। out.println ", आउटपुट जो स्ट्रिंग होगी" ello!"

0

तो:

String foo = "foo"; 
foo.substring(1); 
System.out.println(foo); 

//of course.. 
foo = "aa"; 
System.out.println(foo); 
0

आप स्ट्रिंग एस = का उपयोग करते हैं" abc abc "फिर जब आप", आप स्ट्रिंग ऑब्जेक्ट अपरिवर्तनीय मूल्य होता है करने के लिए एक स्ट्रिंग संदर्भ बनाने के "

,। एस = s.substring (1) ;, आप एक नए बनाए गए स्ट्रिंग ऑब्जेक्ट को निर्दिष्ट करते हैं जिसमें "बीसी" होता है - लेकिन मूल वस्तु अपरिवर्तित है।

यह त्रुटियों का एक आम कारण है, क्योंकि यदि आपने नहीं किया मान असाइन करें, आपको अप्रत्याशित परिणाम मिल सकते हैं।

कई नौसिखिया जावा डेवलपर इस तरह के तरीकों का उपयोग करेंगे जैसे ट्रिम(), यह नहीं समझते कि ट्रिम() स्ट्रिंग को प्रभावित नहीं करता है।

s.trim() < - एस के लिए कुछ भी नहीं है, एक छंटनी वाली स्ट्रिंग देता है - यह एक बग है।

एस = एस.ट्रिम() < - ट्रिम किए गए स्ट्रिंग को स्टोर करता है - यह सही है।

0

टेस्ट यह:

String s = "Test"; 
String j = s; 

s = s.substring(1); 

s अब T है और j अभी भी Test है।

2

// बनाएं स्ट्रिंग "हैलो" के लिए एक संदर्भ रों

स्ट्रिंग रों = "नमस्ते",

// अब स्ट्रिंग के प्रिंट-स्ट्रिंग रों द्वारा संदर्भित

println (s.subString (1));

// अब इसकी छपाई स्ट्रिंग रों द्वारा संदर्भित

println (रों);

ऊपर कोड स्निपेट होगा पहला प्रिंट एच और फिर दूसरा लाइन पर यह हैलो प्रिंट होगा। अब पहले एच क्यों प्रिंट किया? : चीज सबस्ट्रिंग() विधि संदर्भ एस * द्वारा संदर्भित स्ट्रिंग को बदले बिना स्ट्रिंग * देता है। एस अभी भी "हैलो" का जिक्र कर रहा है। अब जब आप प्रिंट करने का प्रयास करते हैं तो यह उस स्ट्रिंग को प्रिंट करेगा जिस पर संदर्भ है। इस तरह स्ट्रिंग "हैलो" immuatble है। आप इसे एक और स्ट्रिंग बनाने के लिए उपयोग करने में सक्षम हैं लेकिन आप इसे म्यूट नहीं कर सकते हैं।

जब कथन का उपयोग करें s = s.subString (1); आप क्या कर रहे हैं यह है कि एस अब "हैलो" के उपस्ट्रिंग() का जिक्र कर रहा है लेकिन "हैलो" स्वयं अभी भी संशोधित नहीं है।