नहीं, बिलकुल नहीं।
सबसे पहले, शब्दार्थ में थोड़ा अंतर है। यदि a
है null
, तो a.concat(b)
फेंकता है NullPointerException
लेकिन a+=b
मूल मान को मान लेगा a
जैसे कि वह था null
। इसके अलावा, concat()
विधि केवल String
मूल्यों को स्वीकार करती है जबकि +
ऑपरेटर चुपचाप तर्क को स्ट्रिंग में बदल देगा ( toString()
ऑब्जेक्ट के लिए विधि का उपयोग करके )। इसलिए concat()
जो इसे स्वीकार करता है, वह विधि अधिक सख्त है।
हुड के नीचे देखने के लिए, एक साधारण वर्ग के साथ लिखें a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
अब javap -c
(सूर्य JDK में शामिल) के साथ जुदा । आपको एक सूची देखनी चाहिए जिसमें शामिल हैं:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
तो, a += b
के बराबर है
a = new StringBuilder()
.append(a)
.append(b)
.toString();
concat
विधि तेजी से होना चाहिए। हालांकि, अधिक स्ट्रिंग्स के साथ StringBuilder
विधि जीत जाती है, कम से कम प्रदर्शन के मामले में।
के स्रोत कोड String
और StringBuilder
(और उसके पैकेज-निजी आधार वर्ग) सूर्य JDK के src.zip में उपलब्ध है। आप देख सकते हैं कि आप एक चार सरणी बना रहे हैं (आवश्यकतानुसार आकार) और फिर अंतिम बनाते समय इसे फेंक दें String
। व्यवहार में स्मृति आवंटन आश्चर्यजनक रूप से तेज है।
अपडेट: पावेल एडम्सकी नोट्स के अनुसार, हाल के हॉटस्पॉट में प्रदर्शन बदल गया है। javac
अभी भी बिल्कुल उसी कोड का उत्पादन करता है, लेकिन बायटेकोड कंपाइलर धोखा देता है। सरल परीक्षण पूरी तरह से विफल रहता है क्योंकि कोड के पूरे शरीर को फेंक दिया जाता है। सममिंग System.identityHashCode
(नहीं String.hashCode
) से पता चलता है कि StringBuffer
कोड में थोड़ा फायदा है। अगला अद्यतन जारी होने पर, या यदि आप किसी भिन्न JVM का उपयोग करते हैं, तो परिवर्तन के अधीन। से @lukaseder , हॉटस्पॉट JVM intrinsics की एक सूची ।