2013-05-22 7 views
5

तो मैं कैथी सिएरा किताब से SCJP के लिए अध्ययन कर रहा हूँ। स्ट्रिंग्स के लिए अध्याय में, यह एक सवाल है: वसंत सर्दियों वसंत गर्मियोंक्या System.out.println में प्रयुक्त स्ट्रिंग्स भी नई अपरिवर्तनीय वस्तुएं बनाते हैं?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
--------------------------- 
What's the output, and how many string objects and ref variables are created? 

उत्पादन है और वहाँ दो संदर्भ चर है, ठीक है।

तो यह कहते हैं आठ स्ट्रिंग ऑब्जेक्ट का निर्माण होगा (वसंत, ग्रीष्म, वसंत गर्मियों ... आदि) जो कि कुछ भी नहीं होने के कारण उन्हें संदर्भित खो रहे हैं सहित देखते हैं।

हालांकि, यह पिछले sysout से कुछ भी शामिल नहीं है।

मेरा प्रश्न कर रहे हैं एक स्थान के साथ concat जा रहा है, यह भी नई वस्तुओं का निर्माण नहीं करता कोड की अंतिम पंक्ति में है, एस 1 और एस 2 के बाद से? या यह बस प्रदर्शन के लिए स्ट्रिंग बफर को पास किया जाएगा, और नई वस्तुओं को नहीं बनाया जाएगा?

यह स्पष्ट रूप से बहुत ही बुनियादी है और मैं कहीं और देखा लेकिन कुछ भी सीधे इस जवाब दे दिया। मेरी समझ से, इसे वहां नई वस्तुओं को भी बनाना चाहिए, लेकिन मुझे परीक्षा के लिए निश्चित होना चाहिए! विचार?

धन्यवाद, अग्रिम में!

+2

ऊपर दिए गए कोड को संकलित करें, इसे 'javap -c' पर फ़ीड करें, और यह जांचें कि यह किस बाइटकोड को संकलित करता है। एक अंतर्निहित 'स्ट्रिंगबफर' होना चाहिए जो अंततः 'toString()' पर कॉल किया जाता है, जिसे प्रश्न का उत्तर देना चाहिए। – millimoose

+2

(इसके अलावा, प्रश्न प्रमाणन के साथ गलत सब कुछ की तरह है। संदर्भ चर के लिए इसका मतलब क्या है * बनाया गया *? वे एक संकलित समय निर्माण कर रहे हैं, उन्हें सबसे अच्छी तरह घोषित किया गया है। अस्पष्टता भी उत्पन्न हो रही है जब स्ट्रिंग अक्षर तैयार किए जाते हैं - वे निश्चित रूप से स्ट्रिंग मैनिपुलेशन ऑपरेशंस के परिणामों की तुलना में पहले बनाए जाते हैं।) – millimoose

+0

@ मिलिमुओज़ मुझे लगता है कि उन प्रश्नों को ऑब्जेक्ट इंस्टेंटेशन, जेवीएम और स्ट्रिंग स्थिरांक के आपके ज्ञान का परीक्षण करने के लिए डिज़ाइन किया गया है - सभी मान्य क्षेत्र :) – vikingsteve

उत्तर

5

मेरा प्रश्न कोड की अंतिम पंक्ति में है, क्योंकि एस 1 और एस 2 अंतरिक्ष के साथ मिलकर हैं, क्या यह नई वस्तुओं को भी नहीं बनाता है?

हां, यह 10 वीं स्ट्रिंग बनाता है।

ध्यान दें कि कोड का यह टुकड़ा केवल बनाता है 5 स्ट्रिंग्स - यदि आप इसे एक ही JVM में कई बार चलाते हैं, तो यह हर बार जब आप इसे कॉल करते हैं तो 5 नए स्ट्रिंग बनाएंगे। स्ट्रिंग अक्षर प्रत्येक बार कोड चलाने पर एक नई स्ट्रिंग नहीं बनाएगा। (समान स्ट्रिंग वस्तु "spring " के लिए हर बार पुन: उपयोग किया जाता है, उदाहरण के लिए।)

कोड में 10 तार आपके द्वारा दिए गए हैं:

  • 5 शाब्दिक: "वसंत", "समर", " गिरावट "," सर्दियों "और"
  • 5 concatenation परिणाम: s1 + "summer", s1.concat("fall "), s1 + winter (यौगिक असाइनमेंट के साथ) और s1 + " " + s2

हमेशा एक अलग स्ट्रिंग शामिल नहीं के रूप में मैं सिर्फ टिप्पणी की है, एक स्ट्रिंग शाब्दिक कोड में दिखाई दे रहा है। उदाहरण के लिए, पर विचार करें:

String x = "Foo" + "Bar"; 

आपको लगता है कि तीन स्ट्रिंग वस्तुओं को शामिल करने की उम्मीद कर सकते हैं - शाब्दिक से प्रत्येक के लिए एक है, और संयोजन के लिए एक।वास्तव में, यह केवल एक ही शामिल है, क्योंकि संकलक संकलन समय पर संयोजन करता है, तो कोड को प्रभावी ढंग से है:

String x = "FooBar"; 
+0

आपका मतलब है कि यदि वे स्ट्रिंग निरंतर पूल में मौजूद हैं, तो उन्हें फिर से सही नहीं बनाया जाएगा? हालांकि यह पांच स्ट्रिंग्स नहीं बनाएगा? कोड की अंतिम पंक्ति में स्थान सहित - " फिर पुस्तक का अर्थ वास्तव में क्या होता है, जब यह कहता है कि यह स्ट्रिंग ऑब्जेक्ट बनाता है? क्या इसका मतलब 9 स्ट्रिंग ऑब्जेक्ट्स है, लेकिन केवल 5 स्ट्रिंग अक्षर हैं? –

+0

जब तक आप नया नहीं कहते() इस मामले में एक प्रतिलिपि बनाई जाएगी। –

+0

@ nilay9999: आप बिल्कुल सही हैं: मैंने ग़लत किया। 10 तार हैं; 5 शाब्दिक ('वसंत" ', 'गर्मी" ','" गिरावट "', 'सर्दी "', '" "' ') और 5 concatenation परिणाम (' s1 + "गर्मी" ',' s1.concat ("गिरावट") ',' s1 + सर्दियों '(यौगिक असाइनमेंट के साथ) और 's1 +" "+ s2')। –

2

मैं किसी अन्य के लिए anwser होगा, स्पष्ट सवाल: कितने स्ट्रिंग उदाहरणों में शामिल हैं निम्नलिखित कोड का टुकड़ा:

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
  1. स्ट्रिंग शाब्दिक "वसंत"
  2. स्ट्रिंग शाब्दिक "गर्मी"
  3. के संयोजन एस 1 और
  4. 0 "गर्मी"
  5. स्ट्रिंग शाब्दिक "गिरावट"
  6. एस 1 के संयोजन और "गिर"
  7. के संयोजन s2 और एस 1
  8. स्ट्रिंग शाब्दिक "शीत ऋतु"
  9. एस 1 के संयोजन और "सर्दियों"
  10. स्ट्रिंग शाब्दिक "" sysout

तो कुल 10 में एस 1 और एस 2 की

  • कड़ी।

  • +0

    इसके लिए धन्यवाद - जॉन स्कीट से इसके जवाब में जोड़ने के लिए बस पूछने वाला था। बहुत उपयोगी। –

    +0

    @AndrewMartin: जैसा कि ओपी ने बताया, वहां भी "" है - इसलिए कुल में 10 हैं। मुझे पहली बार भी याद आया। –

    +0

    @ जोन्स स्केट: मजेदार, बस उस पर मेरा सिर खरोंच कर रहा था। अब समझ में आता है, चीयर्स। –

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