1. तुलना

प्रोग्रामरना नेहमी वेगवेगळ्या व्हेरिएबल्सची एकमेकांशी तुलना करणे आवश्यक असते. परंतु, जसे आपण आधीच पाहिले आहे, सर्व काही इतके सोपे नाही.

पूर्णांक तुलना करणे खूप सोपे आहे — तुम्ही फक्त वापरा ==आणि तुमचे काम पूर्ण झाले. वास्तविक संख्यांची तुलना करण्यासाठी , तुम्हाला त्यांचा फरक (किंवा त्याऐवजी, फरकाचे परिपूर्ण मूल्य) काही अगदी लहान संख्येशी तुलना करावी लागेल.

तारांची तुलना करणे आणखी कठीण आहे. सर्वात महत्त्वाचे म्हणजे, हे असे आहे कारण स्ट्रिंग ऑब्जेक्ट्स आहेत. इतकेच काय, प्रोग्रामरना अनेकदा परिस्थितीनुसार स्ट्रिंगची तुलना थोडी वेगळी व्हावी असे वाटते.


2. स्ट्रिंगची मेमरी कशी व्यवस्थित केली जाते

तुम्ही आधीच पाहिल्याप्रमाणे, स्ट्रिंग पूर्णांक आणि वास्तविक संख्यांपेक्षा वेगळ्या पद्धतीने मेमरीमध्ये संग्रहित केल्या जातात:

स्ट्रिंगची मेमरी कशी व्यवस्थित केली जाते

स्ट्रिंग्स साठवण्यासाठी मेमरीचे दोन ब्लॉक वापरले जातात: एक ब्लॉक मजकूर स्वतः साठवतो (त्याचा आकार मजकूराच्या आकारावर अवलंबून असतो) तर दुसरा ब्लॉक (4 बाइट्स) पहिल्या ब्लॉकचा पत्ता संग्रहित करतो.

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


3. स्ट्रिंगला संदर्भ नियुक्त करणे

जेव्हा तुम्हाला एक स्ट्रिंग व्हेरिएबल दुसर्‍या स्ट्रिंग व्हेरिएबलला नियुक्त करण्याची आवश्यकता असते तेव्हा या पद्धतीचे फायदे स्पष्ट होतात. उदाहरण:

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

आणि परिणामी मेमरीमध्ये काय असेल ते येथे आहे:

स्ट्रिंगसाठी संदर्भ नियुक्त करणे

या प्रकारच्या असाइनमेंट ऑपरेशननंतर, Stringऑब्जेक्ट जिथे होता तिथेच राहतो आणि फक्त त्याचा पत्ता (ऑब्जेक्टचा संदर्भ) व्हेरिएबलमध्ये कॉपी केला जातो message.


4. संदर्भ आणि वस्तूंसह कार्य करणे

Stringपरंतु जर तुम्ही स्ट्रिंगला अपरकेस (कॅपिटल अक्षरे) मध्ये रूपांतरित करायचे ठरवले, तर Java मशीन सर्वकाही बरोबर करते: तुमच्याकडे दोन ऑब्जेक्ट्स असतील आणि 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वस्तू जशी होती तशीच मेमरीमध्ये राहते - फक्त त्याचे संदर्भ दिले जातात आणि व्हेरिएबल्समध्ये साठवले जातात.


String5. वस्तूंच्या संदर्भांची तुलना करणे

आणि शेवटी, आम्ही मजेशीर भागावर पोहोचलो आहोत: स्ट्रिंग तुलना.

स्ट्रिंग व्हेरिएबल्सची तुलना करण्यासाठी तुम्ही दोन ऑपरेटर वापरू शकता: ==(समान) आणि !=(समान नाही). तुम्ही "त्यापेक्षा मोठे", "पेक्षा कमी", किंवा "त्यापेक्षा मोठे किंवा समान" ऑपरेटर वापरू शकत नाही - कंपाइलर त्यास परवानगी देणार नाही.

परंतु येथे एक मनोरंजक सूक्ष्मता आहे: स्ट्रिंग व्हेरिएबल्समध्ये खरोखर काय साठवले जाते? ते बरोबर आहे: वस्तूंचे पत्ते (संदर्भ). आणि या पत्त्यांची तुलना केली जाईल:

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

मेमरीमध्ये काय असेल ते येथे आहे:

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

messageआणि व्हेरिएबल्स textएकाच ऑब्जेक्टचा संदर्भ घेतात (त्याचा पत्ता संग्रहित करतात). परंतु 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