1. तुलना

प्रोग्रामर को हर समय एक दूसरे के साथ विभिन्न चरों की तुलना करने की आवश्यकता होती है। लेकिन, जैसा कि आप पहले ही देख चुके हैं, सब कुछ इतना आसान नहीं है।

पूर्णांकों की तुलना करना बहुत आसान है — आप बस उपयोग करें ==और आपका काम हो गया। वास्तविक संख्याओं की तुलना करने के लिए , आपको उनके अंतर (या बल्कि, अंतर के निरपेक्ष मान) की तुलना किसी बहुत छोटी संख्या से करनी होगी।

तार की तुलना करना और भी कठिन है। इन सबसे ऊपर, यह इसलिए है क्योंकि तार वस्तुएँ हैं। क्या अधिक है, प्रोग्रामर अक्सर स्थिति के आधार पर स्ट्रिंग तुलना को थोड़ा अलग करना चाहते हैं।


2. मेमोरी को कैसे व्यवस्थित किया जाता है

जैसा कि आप पहले ही देख चुके हैं, स्ट्रिंग्स को पूर्णांकों और वास्तविक संख्याओं की तुलना में स्मृति में अलग तरीके से संग्रहीत किया जाता है:

स्ट्रिंग्स को मेमोरी कैसे व्यवस्थित किया जाता है

स्ट्रिंग्स को स्टोर करने के लिए मेमोरी के दो ब्लॉक का उपयोग किया जाता है: एक ब्लॉक टेक्स्ट को स्टोर करता है (इसका आकार टेक्स्ट के आकार पर निर्भर करता है) जबकि दूसरा ब्लॉक (4 बाइट्स) पहले ब्लॉक के पते को स्टोर करता है।

हालांकि एक अनुभवी प्रोग्रामर कुछ ऐसा कहेगा जैसे " वैरिएबल किसी ऑब्जेक्ट String strके संदर्भ को स्टोर करता है ।String


3. एक स्ट्रिंग के संदर्भ निर्दिष्ट करना

इस दृष्टिकोण के लाभ तब स्पष्ट हो जाते हैं जब आपको एक स्ट्रिंग वैरिएबल को दूसरे स्ट्रिंग वैरिएबल को असाइन करने की आवश्यकता होती है। उदाहरण:

String text = "This is a very important message";
String message = text;

और परिणामस्वरूप स्मृति में क्या होगा:

एक स्ट्रिंग के लिए संदर्भ निर्दिष्ट करना

इस प्रकार के असाइनमेंट ऑपरेशन के बाद, Stringऑब्जेक्ट वहीं रहता है जहां वह था, और केवल उसका पता (ऑब्जेक्ट का संदर्भ) messageचर में कॉपी किया जाता है।


4. संदर्भों और वस्तुओं के साथ कार्य करना

Stringलेकिन यदि आप एक स्ट्रिंग को अपरकेस (कैपिटल लेटर) में बदलने का निर्णय लेते हैं, तो जावा मशीन सब कुछ ठीक करती है: आप दो वस्तुओं के साथ समाप्त हो जाएंगे , textऔर messageचर संदर्भों को संग्रहीत करेंगे, प्रत्येक अपनी वस्तु के लिए।

उदाहरण:

String text = "This is a very important message";
String message = text.toUpperCase(); 

और परिणामस्वरूप स्मृति में क्या होगा:

संदर्भ और वस्तुओं के साथ काम करना

कृपया ध्यान दें कि toUpperCase()विधि उस स्ट्रिंग को नहीं बदलती जिस पर इसे कहा जाता है। इसके बजाय, यह एक नई स्ट्रिंग (नई वस्तु) बनाता है और इसका संदर्भ देता है।

कैसे एक और भी दिलचस्प उदाहरण के बारे में। मान लें कि आप किसी ऑब्जेक्ट को स्ट्रिंग पास करने का निर्णय लेते हैं Scanner(ताकि वह स्ट्रिंग से मान पढ़ सके)।

उदाहरण:

String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();

आप इस बारे में अधिक जान सकते हैं कि Scannerकक्षा यहां कैसे काम करती है ।

इस तरह यह सब स्मृति में संग्रहीत किया जाएगा:

संदर्भ और वस्तुओं के साथ काम करना।  स्कैनर वर्ग

इस मामले में, एक Stringवस्तु स्मृति में बनी रहती है जैसे वह थी - केवल इसके संदर्भों को पास किया जाता है और चर में संग्रहीत किया जाता है।


5. Stringवस्तुओं के संदर्भों की तुलना करना

और अंत में, हम मज़ेदार हिस्से तक पहुँच गए हैं: स्ट्रिंग तुलना।

स्ट्रिंग चर की तुलना करने के लिए आप दो ऑपरेटर का उपयोग कर सकते हैं: ==(बराबर) और !=(बराबर नहीं)। आप "से अधिक", "से कम", या "से अधिक या बराबर" ऑपरेटरों का उपयोग नहीं कर सकते - संकलक इसे अनुमति नहीं देगा।

लेकिन यहां एक दिलचस्प सूक्ष्मता है: वास्तव में स्ट्रिंग चर में क्या संग्रहीत होता है? यह सही है: वस्तुओं के पते (संदर्भ)। और इन पतों की तुलना की जाएगी:

String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 

यहाँ स्मृति में क्या होगा:

स्ट्रिंग ऑब्जेक्ट्स के संदर्भों की तुलना करना

और वेरिएबल्स एक ही ऑब्जेक्ट को संदर्भित करते हैं (पता स्टोर करें) messagetextलेकिन s1और s2चर उन वस्तुओं के संदर्भों को संग्रहीत करते हैं जो बहुत समान लेकिन विशिष्ट हैं।

और यदि आप कोड में इन 4 वेरिएबल्स की तुलना करते हैं, तो आपको निम्न परिणाम मिलते हैं:

कोड कंसोल आउटपुट
String text = "Hi";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 


true  // The addresses are equal
false // The addresses are different
false // The addresses are different