# स्ट्रिंग: पूल, बिल्डर व जाल — कोर जावा

Source: https://www.geekswithgeeks.com/hi/core-java/java-string-deep-dive

> जानें Java स्ट्रिंग कैसे संग्रहित होती हैं, लिटरल एक साझा पूल में क्यों इंटर्न होते हैं, StringBuilder बनाम StringBuffer कब उपयोग करें, और == बनाम equals की क्लासिक गलती।

## स्ट्रिंग पूल

स्ट्रिंग लिटरल (`"hi"`) हीप के भीतर एक विशेष **स्ट्रिंग पूल** में रखे जाते हैं। कम्पाइलर एक ही लिटरल दोबारा देखे तो दोनों वेरिएबल **एक ही** पूल्ड ऑब्जेक्ट को इंगित करते हैं। `new String("hi")` जानबूझकर एक नया, गैर-पूल्ड ऑब्जेक्ट बनाता है।

```java
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 सच में कई थ्रेड्स में साझा हो।

```java
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()` उपयोग करें।

त्वरित जाँच

**Quiz:** दो String लिटरल के लिए `s1 == s2` true क्यों हो सकता है पर `new String(...)` के बाद false?

- [ ] == हमेशा स्ट्रिंग की सामग्री तुलना करता है
- [x] लिटरल स्ट्रिंग पूल से साझा होते हैं; new String() नया ऑब्जेक्ट बनाता है
- [ ] यह एक JVM बग है
- [ ] स्ट्रिंग प्रिमिटिव हैं इसलिए == अपरिभाषित है

*Answer:* लिटरल स्ट्रिंग पूल से साझा होते हैं; new String() नया ऑब्जेक्ट बनाता है. लिटरल एक साझा पूल में इंटर्न होते हैं, इसलिए समान लिटरल एक ही ऑब्जेक्ट साझा करते हैं। new String(...) पूलिंग से बाहर रहकर हमेशा नया ऑब्जेक्ट बनाता है।
