2012-01-25 10 views
5

मैं इस प्रश्न पूछा गया था:जावा स्ट्रिंग ऑब्जेक्ट्स मेमोरी में कैसे संभालता है?

String s = "abc"; // creates one String object and one 
      // reference variable 
In this simple case, "abc" will go in the pool and s will refer to it. 
String s = new String("abc"); // creates two objects, 
       // and one reference variable* 

उपरोक्त विवरण कितने संदर्भ चर कोड के नीचे की println बयान करने से पहले बनाए गए थे कितने स्ट्रिंग वस्तुओं और के आधार पर?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

मेरा जवाब था इस कोड टुकड़ा का परिणाम वसंत सर्दियों वसंत गर्मियों

है दो संदर्भ चर, एस 1 और s2 रहे हैं। इस प्रकार बनाई गई आठ स्ट्रिंग ऑब्जेक्ट्स थीं: "वसंत", "गर्मी" (खो गई), "वसंत गर्मी", "गिरावट" (खो गई), "वसंत गिरावट" (खो गई), "वसंत ग्रीष्म ऋतु" (खो गया), "सर्दियों" (खोया), "वसंत सर्दियों" (इस बिंदु पर "वसंत" खो गया है)।

इस प्रक्रिया में केवल आठ स्ट्रिंग ऑब्जेक्ट्स में से केवल दो खो नहीं गए हैं।

क्या यह सही है?

+0

कुछ जानना अच्छा है: http://stackoverflow.com/questions/7663252/java-string-concat-in-stringbuilder-call/ ध्यान दें कि इस प्रश्न का मेरा जवाब गलत था ... – Gevorg

उत्तर

3

जवाब है: 2 संदर्भ और 8 वस्तुओं

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already) 

String s2 = s1 + "summer "; //Two references and 3 objects 

s1.concat("fall "); //Two references and 5 objects 

s2.concat(s1); //Two references and 6 objects 

s1 += "winter "; //Two references and 8 objects 

System.out.println(s1 + " " + s2); 

अब अपने प्रश्न:।? कैसे स्मृति में जावा संभाल स्ट्रिंग वस्तुओं करता

012,351,

जावा String वर्ग की वस्तु बनाने के दो तरीके प्रदान करता है।

  1. स्ट्रिंग str1 = "वनस्ट्रिंग";

इस मामले में, JVM स्ट्रिंग पूल की खोज करता है यह देखने के लिए कि समतुल्य स्ट्रिंग पहले से मौजूद है या नहीं। यदि हां, तो संदर्भ को वापस कर देता है। यदि नहीं, तो इसे स्ट्रिंग पूल में जोड़ता है और संदर्भ देता है। तो एक नई वस्तु बनाई जा सकती है या हो सकती है।

  1. स्ट्रिंग str1 = नया स्ट्रिंग ("वनस्ट्रिंग");

अब, JVM को ढेर पर एक वस्तु बनाना है। नए के कारण। इससे कोई फर्क नहीं पड़ता कि OneString स्ट्रिंग पूल में पहले से मौजूद है।

तुम भी पूल के लिए एक स्ट्रिंग डाल सकते हैं:

आप प्रशिक्षु() स्ट्रिंग ऑब्जेक्ट पर कॉल कर सकते हैं। यह स्ट्रिंग ऑब्जेक्ट को पूल में रखेगा यदि यह पहले से मौजूद नहीं है, और पूल स्ट्रिंग के संदर्भ को वापस कर देगा। (यदि यह पहले से ही पूल में था, तो यह उस ऑब्जेक्ट का संदर्भ देता है जो पहले से मौजूद था)।

आप निम्न लिंक को देखने के लिए पसंद कर सकते हैं:

What is the Java string pool and how is "s" different from new String("s")?

Questions about Java's String pool

1

सही दिखता है। यह एक एससीजेपी परीक्षा प्रश्न बीटीडब्ल्यू है।

कॉन्सट एक नया स्ट्रिंग देता है, यह खो जाता है। पहले एस 1 "वसंत सर्दियों"

दो बातें आप जावा में स्ट्रिंग्स के बारे में पता होना चाहिए के साथ अधिरोहित है:

  • स्ट्रिंग्स अपरिवर्तनीय हैं (जैसा कि पहले से ही आप के द्वारा समझाया)
  • स्ट्रिंग्स स्ट्रिंग में रहते हैं सकता है पूल। हर बार जब आप "ग्रीष्मकालीन" लिखते हैं, तो पूरी तरह से नया स्ट्रिंग आईएसटी नहीं बनाया जाता है, अपरिवर्तनीय "ग्रीष्मकालीन" पूल से बाहर आ सकता है (जेवीएम पर निर्भर करता है, लेकिन ओरेकल के लिए, यह है)। यह भी देखें: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern()

चीयर्स जावा में ईसाई

+0

क्या आप और टिप्पणी कर सकते हैं _ हर बार जब आप नई स्ट्रिंग ("ग्रीष्मकालीन") लिखते हैं तो पूरी तरह से नया स्ट्रिंग आईएसटी निर्मित नहीं होता है? "नया", ** नया java.lang.String ** ऑब्जेक्ट का निर्माण करके (यानी दो स्ट्रिंग्स समान नहीं हैं ==) द्वारा तुलना करते समय। हालांकि, उन दो अलग-अलग स्ट्रिंग उदाहरण अंतर्निहित char [] सरणी (कुछ स्थितियों के तहत) साझा कर सकते हैं। –

+0

हां, मैंने जल्दी से टाइप किया। आप सही हैं, स्ट्रिंग ऑब्जेक्ट का निर्माण किया गया है - मेरा मतलब है कि "स्ट्रिंग" को शायद अधिक मेमोरी की आवश्यकता नहीं है, क्योंकि यह स्ट्रिंग पूल में है। कृपया यह भी देखें: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern() – Christian

1

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

आप तारों पर संयोजन या + करते हैं, तो नए स्ट्रिंग alloacted जाएगा और डेटा एक साथ compied (प्रदर्शन की सजा के साथ

इसके विपरीत, स्ट्रिंग से बाहर-स्ट्रिंग पैदा कर रही है लगभग मुफ्त -। कोई डेटा कॉपी कर दिए जाएंगे

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

एक स्ट्रिंग वस्तु ही अगर वस्तु स्ट्रिंग लगातार पहले से ही पूल पर मौजूद नहीं है बनाता है ।

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

यह वास्तव में ढेर में केवल एक वस्तु बनाता है। यह इस ऑब्जेक्ट को पूल में जोड़ता है अगर केवल और अगर स्ट्रिंग ऑब्जेक्ट पर इंटर्न() विधि को कॉल किया जाता है।

String s1 = "spring "; 
String s2 = s1 + "summer ";   
s1.concat("fall ");   
s2.concat(s1);   
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

आप स्पष्टीकरण ठीक लगता है, को छोड़कर आप println() में एक और स्ट्रिंग है। :-)
जब आप कहते हैं कि (खो) यह वास्तव में मतलब है कि यह कोई और अधिक लाइव वस्तु है कि (संदर्भ ढेर पर मौजूद नहीं है)।

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