String vs StringBuffer vs StringBuilder
Text रखने के तीन तरीके
Java में text के तीन classes हैं: String, StringBuilder और StringBuffer। ये इसमें अलग हैं कि बदल सकते हैं या नहीं (mutability), कितने तेज़ हैं, और thread-safe हैं या नहीं। जब आप बहुत text बनाएँ या edit करें तब सही चुनना मायने रखता है।
String — immutable
String s = "Hello"; s = s + " World"; // हर बार नई string बनाता है
String बदली नहीं जा सकती। हर + बिल्कुल नया String object बनाता है। कुछ joins को यह ठीक है, पर loop में कई बार करें तो धीमा।
StringBuilder — तेज़ और mutable
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
sb.append("!");
System.out.println(sb.toString());
StringBuilder उसी object को append() से जगह पर बदलता है — हर बार नए objects नहीं। यह strings बनाने का तेज़, standard विकल्प है, ख़ासकर loops के अंदर।
StringBuffer — thread-safe
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb.toString());
StringBuffer बिल्कुल StringBuilder जैसा चलता है पर इसकी methods synchronized हैं, जो कई threads के एक ही object को edit करने पर सुरक्षित बनाता है। वो सुरक्षा इसे थोड़ा धीमा बनाती है।
Performance क्यों अलग है
// धीमा: हर loop बारी नई String String s = ""; for (int i = 0; i < 1000; i++) s += i; // तेज़: एक object, जगह पर edit StringBuilder b = new StringBuilder(); for (int i = 0; i < 1000; i++) b.append(i);
| Step | i ki value | Condition | Kya hua | i ab |
|---|---|---|---|---|
| 1 | 0 | 0 < 1000 → true | loop body chalta hai | i → 1 |
| 2 | 1 | 1 < 1000 → true | loop body chalta hai | i → 2 |
| 3 | 2 | 2 < 1000 → true | loop body chalta hai | i → 3 |
| 4 | 3 | 3 < 1000 → true | loop body chalta hai | i → 4 |
| 5 | 4 | 4 < 1000 → true | loop body chalta hai | i → 5 |
| 6 | 5 | 5 < 1000 → true | loop body chalta hai | i → 6 |
| 7 | 6 | 6 < 1000 → true | loop body chalta hai | i → 7 |
| 8 | 7 | 7 < 1000 → true | loop body chalta hai | i → 8 |
| 9 | 8 | 8 < 1000 → true | loop body chalta hai | i → 9 |
| 10 | 9 | 9 < 1000 → true | loop body chalta hai | i → 10 |
| 11 | 10 | 10 < 1000 → true | loop body chalta hai | i → 11 |
| 12 | 11 | 11 < 1000 → true | loop body chalta hai | i → 12 |
| 13 | 12 | 12 < 1000 → true | loop body chalta hai | i → 13 |
| 14 | 13 | 13 < 1000 → true | loop body chalta hai | i → 14 |
| 15 | 14 | 14 < 1000 → true | loop body chalta hai | i → 15 |
| 16 | 15 | 15 < 1000 → true | loop body chalta hai | i → 16 |
| 17 | 16 | 16 < 1000 → true | loop body chalta hai | i → 17 |
| 18 | 17 | 17 < 1000 → true | loop body chalta hai | i → 18 |
| 19 | 18 | 18 < 1000 → true | loop body chalta hai | i → 19 |
| 20 | 19 | 19 < 1000 → true | loop body chalta hai | i → 20 |
| 21 | 20 | 20 < 1000 → true | loop body chalta hai | i → 21 |
| 22 | 21 | 21 < 1000 → true | loop body chalta hai | i → 22 |
| 23 | 22 | 22 < 1000 → true | loop body chalta hai | i → 23 |
| 24 | 23 | 23 < 1000 → true | loop body chalta hai | i → 24 |
| 25 | 24 | 24 < 1000 → true | loop body chalta hai | i → 25 |
| … loop isi tarah chalta rahता hai | ||||
String loop हज़ार फेंकने योग्य objects बनाता है; StringBuilder loop एक दोबारा इस्तेमाल करता है। ज़्यादा text-building को यह अंतर विशाल है।
तुलना
| बात | String | StringBuilder | StringBuffer |
|---|---|---|---|
| Mutable | नहीं | हाँ | हाँ |
| Thread-safe | हाँ (immutable) | नहीं | हाँ |
| Speed | बनाने में धीमा | सबसे तेज़ | थोड़ा धीमा |
| किसके लिए | Fixed text | ज़्यादातर building | Multi-thread building |
आम गलतियाँ
- Loop में String
+=इस्तेमाल करना। धीमा — StringBuilder इस्तेमाल कीजिए। - हर जगह StringBuffer इस्तेमाल करना। Single-threaded code में इसकी thread safety बेकार है; StringBuilder तेज़ है।
toString()भूलना। ज़रूरत पड़ने पर builder कोtoString()से वापस String बनाइए।- String के जगह पर बदलने की उम्मीद। यह कभी नहीं होता — यह immutable है।
सारांश
- String immutable है; हर बदलाव नया object बनाता है।
- StringBuilder mutable और तेज़ है — text बनाने का default।
- StringBuffer mutable और thread-safe है पर थोड़ा धीमा।
- Loops में String
+=के बजाय StringBuilder इस्तेमाल कीजिए। - StringBuffer सिर्फ़ तब चुनिए जब कई threads एक ही text edit करें।
आगे, text की बुनियाद दोहराइए Java strings में, या उन्हें लगाइए reverse a string में।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
String, StringBuffer और StringBuilder में क्या अंतर है?
Concatenation को StringBuilder String से तेज़ क्यों है?
+ नया object बनाता है, जो loop में धीमा है। StringBuilder उसी object को append() से जगह पर edit करता है, वे सारे अतिरिक्त objects बचाकर।StringBuffer के लिए thread-safe का क्या मतलब है?
StringBuilder बनाम StringBuffer कब इस्तेमाल करूँ?
Loop में String या StringBuilder इस्तेमाल करूँ?
+= से String बनाना कई temporary objects बनाता है और धीमा है; StringBuilder.append() कहीं ज़्यादा कुशल है।