Java में स्ट्रिंग ऑब्जेक्ट बनाने के दो तरीके हैं:
- new ऑपरेटर का उपयोग करके
String str = new String("Tutorials Point");
- स्ट्रिंग लिटरल का उपयोग करके
String str = "Tutorials Point";
जब भी हम Java में new String() कॉल करते हैं, यह हीप मेमोरी में एक ऑब्जेक्ट बनाता है और स्ट्रिंग लिटरल्स स्ट्रिंग कॉन्स्टेंट पूल (SCP) में जाते हैं।
ऑब्जेक्ट्स के लिए, JVM ने SCP का उपयोग किया जो Java में कुशल मेमोरी प्रबंधन के लिए है। अन्य Java ऑब्जेक्ट्स के विपरीत, स्ट्रिंग ऑब्जेक्ट को हीप क्षेत्र पर प्रबंधित करने के बजाय, उन्होंने स्ट्रिंग कॉन्स्टेंट पूल पेश किया। स्ट्रिंग कॉन्स्टेंट पूल की एक महत्वपूर्ण विशेषता यह है कि यदि पूल में पहले से ही वही स्ट्रिंग कॉन्स्टेंट मौजूद है, तो यह उसी स्ट्रिंग ऑब्जेक्ट को दोबारा नहीं बनाता।
उदाहरण
public class SCPDemo {
public static void main(String args[]) {
String s1 = "Tutorials Point";
String s2 = "Tutorials Point";
System.out.println("s1 and s2 are string literals:");
System.out.println(s1 == s2); // true - समान रेफरेंस
String s3 = new String("Tutorials Point");
String s4 = new String("Tutorials Point");
System.out.println("s3 and s4 with new operator:");
System.out.println(s3 == s4); // false - अलग-अलग ऑब्जेक्ट्स
}
}
आउटपुट
s1 and s2 are string literals: true s3 and s4 with new operator: false
विस्तृत व्याख्या
स्ट्रिंग लिटरल (SCP में)
String s1 = "Hello"; String s2 = "Hello";
- कंपाइलर "Hello" लिटरल को देखता है।
- SCP में "Hello" खोजता है।
- नहीं मिला → SCP में "Hello" ऑब्जेक्ट बनाता है, s1 को रेफरेंस देता है।
- दूसरी बार "Hello" मिला → मौजूदा ऑब्जेक्ट का रेफरेंस s2 को देता है।
- परिणाम:
s1 == s2हैtrue।
new ऑपरेटर (हीप में)
String s3 = new String("Hello");
String s4 = new String("Hello");
newकीवर्ड JVM को हीप में नया ऑब्जेक्ट बनाने का निर्देश देता है।- हर
newकॉल एक नया अलग ऑब्जेक्ट बनाता है। - SCP में "Hello" लिटरल भी हो सकता है (कंपाइल टाइम पर), लेकिन
newउसे नजरअंदाज करके हीप में नया ऑब्जेक्ट बनाता है। - परिणाम:
s3 == s4हैfalse।
क्यों SCP? - डिजाइन कारण
| कारण | व्याख्या |
|---|---|
| मेमोरी दक्षता | स्ट्रिंग्स सबसे अधिक उपयोग होने वाले ऑब्जेक्ट्स हैं। डुप्लीकेशन से बचाकर भारी मेमोरी बचत। |
| प्रदर्शन | == तुलना (रेफरेंस चेक) .equals() (सामग्री चेक) से बहुत तेज़ है। |
| इम्यूटेबिलिटी | चूंकि स्ट्रिंग इम्यूटेबल है, साझा करना सुरक्षित है। कोई थ्रेड सामग्री नहीं बदल सकता। |
| सुरक्षा | क्लास लोडिंग, फाइल पथ, नेटवर्क URL आदि में स्ट्रिंग्स उपयोग होती हैं। इंटर्निंग से टैम्परिंग कठिन होती है। |
intern() मेथड
String s3 = new String("Hello").intern(); // SCP में डालता है / मौजूदा लौटाता है
System.out.println(s1 == s3); // true
निष्कर्ष: स्ट्रिंग लिटरल्स SCP में स्टोर होते हैं ताकि इम्यूटेबल स्ट्रिंग्स को साझा करके मेमोरी बचाई जा सके और प्रदर्शन में सुधार हो सके। new String() हमेशा हीप में नया ऑब्जेक्ट बनाता है, SCP का उपयोग नहीं करता।