जावा में, स्ट्रिंग्स को स्ट्रिंग क्लास के ऑब्जेक्ट के रूप में मेमोरी में संग्रहीत किया जाता है।
जब किसी जावा प्रोग्राम के लिए मेमोरी आवंटित की जाती है, तो JVM (जावा वर्चुअल मशीन) आवंटित मेमोरी को दो भागों में विभाजित करती है। एक भाग स्टैक और दूसरा भाग हीप है। हीप मेमोरी में, जावा कुछ मेमोरी आवंटित करता है, विशेष रूप से शाब्दिक के लिए उस मेमोरी को स्ट्रिंग कॉन्स्टेंट पूल (एससीपी) कहा जाता है। एससीपी हीप के अंदर पूर्वनिर्धारित क्षेत्र है। स्ट्रिंग पूल जावा रनटाइम के लिए बहुत सारी जगह बचाने में मदद करता है। स्ट्रिंग वर्ग अद्वितीय स्ट्रिंग अक्षर संग्रहीत करने के लिए एससीपी का उपयोग करता है।
स्टैक मेमोरी में, चर या चर संदर्भ या ऑब्जेक्ट के संदर्भ संग्रहीत होते हैं।
हीप मेमोरी में, गतिशील रूप से आवंटित सभी ऑब्जेक्ट संग्रहीत होते हैं। किसी ऑब्जेक्ट को मेमोरी आवंटित करने के लिए हम एक नए कीवर्ड का उपयोग करते हैं।
स्ट्रिंग ऑब्जेक्ट बनाने के दो तरीके हैं।
स्ट्रिंग str1 = "माईस्ट्रिंग";
जब भी हम एक स्ट्रिंग लिटरल बनाते हैं, JVM पहले जांचता है कि क्या स्ट्रिंग लिटरल पहले से ही स्ट्रिंग स्थिरांक पूल में मौजूद है। यदि उपलब्ध नहीं है, तो यह एससीपी में एक नई स्ट्रिंग शाब्दिक बनाएगा।
ऊपर चित्र में, str1 एससीपी में "माईस्ट्रिंग" की ओर इशारा करता है। नव निर्मित स्ट्रिंग अक्षर को संभालने के तरीके निम्नलिखित हैं।
स्ट्रिंग str2 = नई स्ट्रिंग(“माईस्ट्रिंग”); // एक नए कीवर्ड का उपयोग करके स्ट्रिंग क्लास को इंस्टेंट करना
जब एक नए कीवर्ड का उपयोग करके एक स्ट्रिंग ऑब्जेक्ट बनाया जाता है, तो यह दो ऑब्जेक्ट बनाएगा। एक एससीपी में दूसरा हीप में और संदर्भ चर स्टैक में संग्रहीत होता है।
हमने पहले ही
का उपयोग करके शाब्दिक "माईस्ट्रिंग" बना लिया हैस्ट्रिंग str1 = "माईस्ट्रिंग";
चूंकि हम एससीपी में डुप्लिकेट नहीं रख सकते हैं, इसलिए जेवीएम एससीपी में एक और ऑब्जेक्ट नहीं बनाएगा, लेकिन स्टैक में वेरिएबल str3 के मौजूदा संदर्भ को वापस कर देगा और यह हीप में एक ऑब्जेक्ट बनाएगा। Str3 हीप में ऑब्जेक्ट "MyString" को इंगित करेगा लेकिन SCP में नहीं।
स्ट्रिंग ऑब्जेक्ट के लिए मेमोरी कैसे आवंटित की जाती है इसके विभिन्न मामले निम्नलिखित हैं।
केस 1: ऊपर परिभाषित स्ट्रिंग ऑब्जेक्ट्स को मेमोरी में कैसे संग्रहीत किया जाता है।
पब्लिक क्लास स्ट्रिंग्सस्टोरेजकॉन्सेप्ट
{
सार्वजनिक स्थैतिक शून्य main (String [] args)
{
स्ट्रिंग str1 = "माईस्ट्रिंग";
स्ट्रिंग str2 = नई स्ट्रिंग(“माईस्ट्रिंग”);
System.out.println(str1 == str2); //आउटपुट:गलत
System.out.println(str1.equals(str2)); //आउटपुट: सत्य
}
}
जब हम "==" ऑपरेटर का उपयोग करके str1 और str2 की तुलना करते हैं तो यह गलत परिणाम देता है। जैसा कि हम जानते हैं "==" ऑपरेटर उनके भौतिक पते की तुलना करता है। यहां हमारे उदाहरण में str1 एससीपी में ऑब्जेक्ट को इंगित कर रहा है और str2 हीप में ऑब्जेक्ट को इंगित कर रहा है। तो यह गलत रिटर्न देता है।
लेकिन str1.equals(str2) के मामले में, जैसा कि हम जानते हैं कि "बराबर" फ़ंक्शन अलग-अलग वर्णों की जांच करता है, str1 और str3 दोनों में समान मान संग्रहीत होता है, यह सत्य लौटाता है।
केस 2: एक और स्ट्रिंग शाब्दिक
स्ट्रिंग str3 = "माईस्ट्रिंग";
str1 और str3 दोनों SCP में एक ही स्ट्रिंग अक्षरशः की ओर इंगित करेंगे।
पब्लिक क्लास स्ट्रिंग्सस्टोरेजकॉन्सेप्ट
{
सार्वजनिक स्थैतिक शून्य main (String [] args)
{
स्ट्रिंग str1 = "माईस्ट्रिंग";
स्ट्रिंग str3 = "माईस्ट्रिंग";
System.out.println(str1 == str2); //आउटपुट: सत्य
System.out.println(str1.equals(str2)); //आउटपुट: सत्य
}
}
s1 == s3 सत्य लौटाता है, क्योंकि "==" ऑपरेटर उनके भौतिक पते की तुलना करता है, लेकिन सामग्री की नहीं।
s1.equals(s3) सत्य लौटाता है, और "बराबर" फ़ंक्शन दोनों संदर्भ चर में अलग-अलग वर्णों की जांच करता है।
केस 3: एक नए कीवर्ड का उपयोग करके एक और स्ट्रिंग ऑब्जेक्ट बनाया जाता है
स्ट्रिंग str4 = नई स्ट्रिंग(“न्यूस्ट्रिंग”);
इस मामले में, जेवीएम एससीपी में इस स्ट्रिंग की जांच करेगा, यह "न्यूस्ट्रिंग" मान के साथ स्ट्रिंग ऑब्जेक्ट नहीं ढूंढ सकता है, इसलिए यह दो ऑब्जेक्ट बनाएगा एक एससीपी में और दूसरा हीप में, संदर्भ चर str4 को इसमें संग्रहीत किया जाएगा ढेर। Str4 में हीप में ऑब्जेक्ट का संदर्भ होगा।
केस 4: एक और स्ट्रिंग शाब्दिक बनाया गया है।
स्ट्रिंग str5 = "न्यूस्ट्रिंग";
इस मामले में, जेवीएम एससीपी में जांच करेगा कि यह शाब्दिक पहले से उपलब्ध है या नहीं, यहां "न्यूस्ट्रिंग" पहले से ही एससीपी में मौजूद है इसलिए जेवीएम एससीपी में डुप्लिकेट नहीं बनाएगा, इसके बजाय यह वेरिएबल str5 का संदर्भ देता है।
केस 5: एक स्ट्रिंग को दूसरी स्ट्रिंग को असाइन करना
स्ट्रिंग str4 = नई स्ट्रिंग(“न्यूस्ट्रिंग”);
स्ट्रिंग str6 = str4; //असाइन करना
यहां str6 और str4 हीप में एक ही ऑब्जेक्ट को इंगित करेंगे और str4 में मान को नहीं मिटाएंगे।
पब्लिक क्लास स्ट्रिंग्सस्टोरेजकॉन्सेप्ट
{
सार्वजनिक स्थैतिक शून्य main (String [] args)
{
स्ट्रिंग str4 = नई स्ट्रिंग(“न्यूस्ट्रिंग”);
स्ट्रिंग str6 = str4;
System.out.println(str4 == str6); //आउटपुट:सत्य
}
}
जेवीएम हीप में "न्यूस्ट्रिंग" का संदर्भ वेरिएबल str6 को देगा। यही कारण है कि str4 == str6 सत्य लौटाता है।
निष्कर्ष में, स्ट्रिंग शाब्दिक और 'नए' ऑपरेटर का उपयोग करके स्ट्रिंग ऑब्जेक्ट बनाने के अपने फायदे और नुकसान हैं।
स्ट्रिंग अक्षर का उपयोग करके, हम डुप्लिकेट न बनाकर मेमोरी को अधिक कुशल बना सकते हैं। JVM एक अद्वितीय ऑब्जेक्ट बनाता है और स्ट्रिंग हमेशा के लिए SCP में रहती है। इसका नकारात्मक पक्ष यह है कि स्ट्रिंग पूल का एक निश्चित आकार होता है और यह किसी समय भर जाएगा।
लेकिन एक नए कीवर्ड का उपयोग करके यह दो ऑब्जेक्ट बनाता है, एक एससीपी में और दूसरा हीप में। ढेर में, यदि हमें वस्तु की आवश्यकता नहीं है तो इसे जगह बनाने के लिए कचरा संग्रहकर्ता द्वारा मिटा दिया जाएगा। लेकिन इसका नकारात्मक पक्ष यह है कि 'नए' ऑपरेटर के साथ JVM को हमेशा एक नया ऑब्जेक्ट बनाना होगा और यह JVM के लिए एक अधिभार है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3