2012-06-24 6 views
6

निम्नलिखित कोड द्वारा कितनी स्ट्रिंग ऑब्जेक्ट बनाई जाएंगी?स्मृति में कितनी स्ट्रिंग ऑब्जेक्ट्स बनाई जाएंगी?

String s=""; 
s+=new String("a"); 
s+="b"; 

मेरे पास यह प्रश्न परीक्षा में था। मैं सही जवाब जानना चाहता हूं। मैंने 2 वस्तुओं को कहा।
पूल से ऑब्जेक्ट जिसमें "", "बी" और नई स्ट्रिंग ("ए") द्वारा बनाई गई वस्तु है;

+3

'b' क्या है? हम इसे जानने के बिना वास्तव में आपके प्रश्न का उत्तर नहीं दे सकते। –

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String%28java.lang.String%29 –

उत्तर

8

स्ट्रिंग एस = "";

कोई ऑब्जेक्ट नहीं बनाता है।

एस + = नया स्ट्रिंग ("ए");

पांच वस्तुओं का निर्माण करता है। new String, स्ट्रिंगबिल्डर और इसके चार [] और स्ट्रिंग परिणामस्वरूप और इसके चार []

एस + = "बी";

चार वस्तुओं बनाता है, StringBuilder और उसके चार [] और स्ट्रिंग जिसके परिणामस्वरूप और उसके चार []

तो मैं नौ वस्तुओं के कुल प्राप्त जिनमें से तीन स्ट्रिंग वस्तुओं

नोट कर रहे हैं: आप यह सुनिश्चित कर सकते हैं कि "" पहले ही लोड हो चुका है क्योंकि यह क्लासलोडर और कक्षा समेत कई सिस्टम वर्गों में दिखाई देता है।

स्ट्रिंग्स "ए" और "बी" इस प्रश्न के उद्देश्य के लिए नए स्ट्रिंग्स के रूप में नहीं माना जा सकता है या नहीं। आईएमएचओ मैं उन्हें गिनता नहीं हूं क्योंकि वे केवल एक बार में बनाए जाएंगे और यदि यह कोड केवल एक बार चलाया जाता है, तो यह शायद ही मायने रखता है कि कितने तार बनाए गए हैं। उपयोगी होने की अधिक संभावना क्या है यह जानने के लिए कि प्रत्येक बार कोड चलने पर कितनी ऑब्जेक्ट बनाई जाती हैं।

+0

कोड संकलित नहीं करता है (अधिक विशेष रूप से निम्न पंक्ति ' एस + = नया स्ट्रिंग ("ए"); ')। आपने रनटाइम पर बनाए गए ऑब्जेक्ट्स की संख्या को गिनने का प्रबंधन कैसे किया? –

+6

सवाल स्ट्रिंग उदाहरणों के बारे में है। न केवल वस्तुओं। –

+0

@DarinDimitrov मेरा आईडीई और कंपाइलर कहता है कि यह संकलित करता है। समस्या क्या माना जाता है? –

9

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

String s=""; 
s+=new String("a"); 
s+="b"; 

और जवाब 6:

  • खाली स्ट्रिंग शाब्दिक: "";
  • स्ट्रिंग अक्षर "a";
  • स्ट्रिंग शाब्दिक "ए" की प्रति: new String("a");
  • स्ट्रिंग s और "a" की प्रतिलिपि द्वारा बनाई गई स्ट्रिंग;
  • स्ट्रिंग शाब्दिक "b"
  • स्ट्रिंग s और "b" श्रृंखलाबद्ध द्वारा बनाई गई।

यदि आप मानते हैं कि तीन स्ट्रिंग अक्षर पहले ही लोड किए गए कोड द्वारा पहले ही बनाए जा चुके हैं, तो कोड स्निपेट इस प्रकार 3 नए स्ट्रिंग उदाहरण बनाता है।

+0

स्ट्रिंग एस 1 = नया स्ट्रिंग ("हैलो"); , JVM स्तर पर कितने संदर्भ बनाए गए हैं? मैं दो वस्तुओं के बारे में जानता हूं: 1 "हैलो" के लिए कक्षा लोडिंग के समय और कमांड के निष्पादन के वास्तविक समय पर 1। 1 संदर्भ एस 1 है, मेरा संदेह यह है कि दूसरा संदर्भ एस 2 भी है जो वर्ग लोडिंग पर "हैलो" स्ट्रिंग का परिणाम है जो "नए स्ट्रिंग()" कन्स्ट्रक्टर को पास किया जाता है। जावा में, कोई फंक्शन या कन्स्ट्रक्टर में ऑब्जेक्ट को पास करने का कोई तरीका नहीं है, हम केवल एक संदर्भ पास कर सकते हैं। इसके अलावा, एक तीसरा संदर्भ एस 3 होना चाहिए, जो नए स्ट्रिंग ("हैलो") का परिणाम होना चाहिए और फिर एस 1 को सौंपा गया है? –

0

वास्तव में जेआईटीसी स्थिति में बनाए गए ऑब्जेक्ट्स की संख्या अनिश्चित है।जेआईटीसी अच्छी तरह से पहचान सकता है कि new String("a") एक पहचान है, और s के कोई मध्यवर्ती मान संदर्भित नहीं हैं, ताकि केवल स्ट्रिंगबिल्डर बनाया जा सके। कई संभावित दुष्प्रभाव हैं जिन्हें सामान्य मामले में नकल किया जाना चाहिए (उदाहरण के लिए, जहां new String() का तर्क अमान्य हो सकता है), लेकिन शाब्दिक के साथ वे नहीं हो सकते हैं।

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

0

न्यू स्ट्रिंग्स

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

String s = "abc"; // creates one String object and one reference variable 

इस सरल मामले में, "abc" जाना होगा पूल में और इसका उल्लेख होगा।

String s = new String("abc"); // creates two objects, and one reference variable 

इस मामले में, क्योंकि हम new कीवर्ड का इस्तेमाल किया, जावा सामान्य (nonpool) स्मृति में एक नया स्ट्रिंग वस्तु पैदा करेगा, और s यह करने के लिए संदर्भित करेंगे। इसके अलावा, शाब्दिक "एबीसी" पूल में रखा जाएगा।

जावा 6 अध्ययन गाइड के लिए SCJP सूर्य प्रमाणित प्रोग्रामर से

(परीक्षा 310-065) .pdf