toString() में StringBuilder बनाम कॉन्केटनेशन: अंदर कैसे काम करता है

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

toString() में StringBuilder बनाम कॉन्केटनेशन: यह अंदर से कैसे काम करता है

\n\n

क्या आपने कभी सोचा है कि Stack Overflow पर आज भी Java में toString() लिखने के सही तरीके को लेकर बहस क्यों होती है? कुछ डेवलपर्स मानते हैं कि StringBuilder ही एकमात्र सही रास्ता है। वहीं दूसरे बिना किसी चिंता के प्लस (+) का उपयोग करके साधारण कॉन्केटनेशन करते हैं। कौन सही है?

\n\n

आइए Java कंपाइलर और JIT (Just-In-Time) ऑप्टिमाइज़र के अंदर झांकते हैं। आप जानेंगे कि जब आप str1 + str2 लिखते हैं तो वास्तव में क्या होता है और 2024 में इस सवाल का जवाब आपको चौंका सकता है।

\n\n

यह विषय इतना लोकप्रिय क्यों है?

\n\n

"StringBuilder vs String concatenation in toString()" सवाल ने Stack Overflow पर हज़ारों व्यूज़ बटोरे हैं, यह कोई संयोग नहीं है। हर Java डेवलपर ने कम से कम एक बार toString() मेथड लिखा है। और हर किसी के सामने यह चुनाव आया है: प्लस से सुंदर लिखूं या StringBuilder से "सही" तरीके से लिखूं।

\n\n

यह मिथक कि Java में स्ट्रिंग कॉन्केटनेशन हमेशा धीमा होता है, 20 साल से ज़्यादा पुराना है। और यह Java 1.4 और Java 5 के ज़माने में सच भी था... लेकिन कंपाइलर अब वहाँ नहीं रुके हैं।

\n\n

Java स्पेसिफिकेशन क्या कहती है?

\n\n

Java Language Specification (JLS §15.18.1) के अनुसार, स्ट्रिंग के लिए + ऑपरेटर सिर्फ़ सिंटैक्स शुगर है। कंपाइलर बाध्य है कि वह स्ट्रिंग कॉन्केटनेशन को कुशल कोड में बदले। Java 5 (J2SE 5.0) से शुरू करके, javac कंपाइलर अपने आप कॉन्केटनेशन को StringBuilder के उपयोग से बदल देता है।

\n\n

आइए इसे व्यवहार में जांचते हैं।

\n\n

कोड का उदाहरण: एक सरल toString()

\n\n

एक क्लासिक उदाहरण लेते हैं — Person क्लास के लिए toString() मेथड:

\n\n
public class Person {\n    private String name;\n    private int age;\n    private String email;\n\n    @Override\n    public String toString() {\n        return "Person{" +\n                "name='" + name + '\\'' +\n                ", age=" + age +\n                ", email='" + email + '\\'' +\n                '}';\n    }\n}\n
\n\n

यह साफ और पढ़ने में आसान लगता है। लेकिन बाइट-कोड में यह कैसा दिखता है?

\n\n

बाइट-कोड में झांकते हैं

\n\n

इस क्लास को कंपाइल करें और javap -c Person.class से बाइट-कोड देखें:

\n\n
public java.lang.String toString();\n    Code:\n       0: new           #7    // class java/lang/StringBuilder\n       3: dup\n       4: invokespecial #8    // Method StringBuilder."<init>":()V\n       7: ldc           #9    // String "Person{name='"\n       9: invokevirtual #10   // StringBuilder.append(String)\n      12: aload_0\n      13: getfield      #3    // Field name:Ljava/lang/String;\n      16: invokevirtual #10   // StringBuilder.append(String)\n      19: ldc           #11   // String "', age="\n      21: invokevirtual #10   // StringBuilder.append(String)\n      24: aload_0\n      25: getfield      #4    // Field age:I\n      28: invokevirtual #12   // StringBuilder.append(int)\n      31: ldc           #13   // String ", email='"\n      33: invokevirtual #10   // StringBuilder.append(String)\n      36: aload_0\n      37: getfield      #5    // Field email:Ljava/lang/String;\n      40: invokevirtual #10   // StringBuilder.append(String)\n      43: ldc           #14   // String "'}"\n      45: invokevirtual #10   // StringBuilder.append(String)\n      48: invokevirtual #15   // StringBuilder.toString():String\n      51: areturn\n
\n\n

देखा? कंपाइलर ने खुद StringBuilder बना लिया! यह एक नया StringBuilder ऑब्जेक्ट बनाता है, स्ट्रिंग के हर हिस्से के लिए append() कॉल करता है, और फिर toString()। बिल्कुल वही जो आप हाथ से लिखते, लेकिन सोर्स कोड ज़्यादा पढ़ने लायक है।

\n\n

स्पष्ट StringBuilder के बारे में क्या?

\n\n

अब स्पष्ट StringBuilder वाला वर्ज़न लिखते हैं:

\n\n
@Override\npublic String toString() {\n    Strin                

ब्लॉग

पुस्तक अनुशंसाएँ