पाठ 8 / 38
स्ट्रिंग: पूल, बिल्डर व जाल
जानें Java स्ट्रिंग कैसे संग्रहित होती हैं, लिटरल एक साझा पूल में क्यों इंटर्न होते हैं, StringBuilder बनाम StringBuffer कब उपयोग करें, और == बनाम equals की क्लासिक गलती।
स्ट्रिंग पूल
स्ट्रिंग लिटरल ("hi") हीप के भीतर एक विशेष स्ट्रिंग पूल में रखे जाते हैं। कम्पाइलर एक ही लिटरल दोबारा देखे तो दोनों वेरिएबल एक ही पूल्ड ऑब्जेक्ट को इंगित करते हैं। new String("hi") जानबूझकर एक नया, गैर-पूल्ड ऑब्जेक्ट बनाता है।
String a = "hi";
String b = "hi";
String c = new String("hi");
System.out.println(a == b); // true (same pooled literal)
System.out.println(a == c); // false (different object)
System.out.println(a == c.intern()); // true (intern() returns pooled copy)StringBuilder बनाम StringBuffer
दोनों mutable कैरेक्टर सीक्वेंस बनाते हैं। StringBuilder तेज़ है और लगभग हर जगह उपयोग होता है; StringBuffer इसका पुराना, synchronized जुड़वाँ है — इसे तभी चुनें जब वही builder सच में कई थ्रेड्स में साझा हो।
StringBuilder sb = new StringBuilder("Java");
sb.append(" rocks").insert(0, ">> ").reverse();
System.out.println(sb); // skcor avaJ >>
System.out.println(sb.length()); // 11== बनाम equals(), फिर से
== रेफ़रेंस की तुलना करता है, सामग्री की नहीं — यह लिटरल के साथ सही दिख सकता है सिर्फ़ पूलिंग के कारण, और यही इसे तब खतरनाक बनाता है जब new String(...), substring() या I/O से आया मान बीच में आए। सामग्री तुलना के लिए हमेशा .equals() उपयोग करें।
त्वरित जाँच
त्वरित जाँच: दो String लिटरल के लिए `s1 == s2` true क्यों हो सकता है पर `new String(...)` के बाद false?
- == हमेशा स्ट्रिंग की सामग्री तुलना करता है
- लिटरल स्ट्रिंग पूल से साझा होते हैं; new String() नया ऑब्जेक्ट बनाता है
- यह एक JVM बग है
- स्ट्रिंग प्रिमिटिव हैं इसलिए == अपरिभाषित है
Answer
लिटरल स्ट्रिंग पूल से साझा होते हैं; new String() नया ऑब्जेक्ट बनाता है — लिटरल एक साझा पूल में इंटर्न होते हैं, इसलिए समान लिटरल एक ही ऑब्जेक्ट साझा करते हैं। new String(...) पूलिंग से बाहर रहकर हमेशा नया ऑब्जेक्ट बनाता है।