Stringक्लास के ऑब्जेक्ट्स इम्यूटेबल (immutable) होते हैं, जबकिStringBufferऔरStringBuilderऑब्जेक्ट्स म्यूटेबल (mutable) होते हैं।StringBufferसिंक्रोनाइज्ड (synchronized) है (थ्रेड-सेफ), जबकिStringBuilderसिंक्रोनाइज्ड नहीं है (नॉन-थ्रेड-सेफ)।- कैटेनेशन ऑपरेटर
"+"आंतरिक रूप सेStringBufferयाStringBuilderका उपयोग करके कार्यान्वित किया जाता है। - यदि ऑब्जेक्ट का मान बदलने वाला नहीं है, तो
Stringक्लास का उपयोग करें क्योंकिStringऑब्जेक्ट इम्यूटेबल है। - यदि ऑब्जेक्ट का मान बदल सकता है और केवल एक थ्रेड द्वारा एक्सेस किया जाएगा, तो
StringBuilderका उपयोग करें क्योंकि यह असिंक्रोनाइज्ड (अनसिंक्रोनाइज्ड) है और तेज़ है। - यदि ऑब्जेक्ट का मान बदल सकता है और एकाधिक थ्रेड्स द्वारा संशोधित किया जाएगा, तो
StringBufferका उपयोग करें क्योंकि यह सिंक्रोनाइज्ड (थ्रेड-सेफ) है।
प्रदर्शन तुलना
| विशेषता | String | StringBuffer | StringBuilder |
|---|---|---|---|
| म्यूटेबिलिटी | इम्यूटेबल | म्यूटेबल | म्यूटेबल |
| थ्रेड-सेफ्टी | हां (इम्यूटेबल होने के कारण) | हां (सिंक्रोनाइज्ड) | नहीं |
| प्रदर्शन | बार-बार संशोधन पर धीमा | धीमा (सिंक्रोनाइजेशन ओवरहेड) | तेज़ (कोई सिंक्रोनाइजेशन नहीं) |
| उपयोग | स्थिर टेक्स्ट, कॉन्स्टेंट्स | मल्टी-थ्रेडेड वातावरण में स्ट्रिंग मैनिपुलेशन | सिंगल-थ्रेडेड वातावरण में स्ट्रिंग मैनिपुलेशन |
| उपलब्धता | Java 1.0 से | Java 1.0 से | Java 5.0 से |
कब क्या उपयोग करें? - निर्णय गाइड
- String: जब स्ट्रिंग स्थिर हो, कॉन्फिगरेशन मान, लिटरल्स, कीज़, आदि।
String url = "https://api.example.com";
- StringBuilder: जब स्ट्रिंग को बार-बार संशोधित करना हो और केवल एक थ्रेड द्वारा उपयोग किया जाता हो (सबसे आम मामला)।
StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i).append(","); } String result = sb.toString(); - StringBuffer: जब स्ट्रिंग को एकाधिक थ्रेड्स द्वारा साझा और संशोधित किया जाता हो (दुर्लभ)।
// मल्टी-थ्रेडेड लॉगिंग बफर StringBuffer logBuffer = new StringBuffer(); // थ्रेड्स logBuffer.append(...) कॉल करते हैं
महत्वपूर्ण नोट
आधुनिक Java (Java 5+) में, कंपाइलर + ऑपरेटर को StringBuilder में ऑप्टिमाइज़ कर देता है। इसलिए साधारण स्ट्रिंग कन्केटनेशन के लिए + का उपयोग करना ठीक है:
String s = "Hello " + "World " + "!"; // कंपाइल टाइम पर ऑप्टिमाइज़
लेकिन लूप में + का उपयोग न करें - वहां StringBuilder स्पष्ट रूप से बनाएं।
निष्कर्ष: अधिकांश मामलों में StringBuilder (सिंगल-थ्रेडेड) सबसे अच्छा विकल्प है। StringBuffer केवल मल्टी-थ्रेडेड साझा बफर के लिए उपयोग करें। String स्थिर टेक्स्ट के लिए उपयोग करें।