"पुराना" तरीका आउटपुट StringBuilder
-ऑर्डिनेटेड ऑपरेशंस का एक गुच्छा है । इस कार्यक्रम पर विचार करें:
public class Example {
public static void main(String[] args)
{
String result = args[0] + "-" + args[1] + "-" + args[2];
System.out.println(result);
}
}
अगर हम JDK 8 या उससे पहले का संकलन करते हैं और फिर javap -c Example
बाइटकोड देखने के लिए उपयोग करते हैं, तो हम कुछ इस तरह देखते हैं:
सार्वजनिक वर्ग उदाहरण {
सार्वजनिक उदाहरण ();
कोड:
0: aload_0
1: invokespecial # 1 // विधि जावा / लंग / वस्तु। "<init>" :() वी
4: वापसी
सार्वजनिक स्थैतिक शून्य मुख्य (java.lang.String []);
कोड:
0: नया # 2 // क्लास जावा / लैंग / स्ट्रिंगबर्ल
3: डुबकी
4: invokespecial # 3 // विधि java / lang / StringBuilder। "<init>" :( v)
7: aload_0
8: iconst_0
9: अनलद
10: invokevirtual # 4 // विधि java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
13: ldc # 5 // स्ट्रिंग -
15: invokevirtual # 4 // विधि java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
18: aload_0
19: iconst_1
20: एलाड
21: invokevirtual # 4 // विधि java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
24: ldc # 5 // स्ट्रिंग -
26: invokevirtual # 4 // विधि java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
29: aload_0
30: iconst_2
31: एलाड
32: invokevirtual # 4 // विधि java / lang / StringBuilder.append: (Ljava / lang / String;) Ljava / lang / StringBuilder;
35: invokevirtual # 6 // विधि java / lang / StringBuilder.toString :() Ljava / lang / स्ट्रिंग;
38: astore_1
39: getstatic # 7 // फ़ील्ड जावा / लैंग / सिस्टम.आउट: Ljava / io / PrintStream;
42: aload_1
43: invokevirtual # 8 // विधि जावा / io / PrintStream.println: (Ljava / lang / स्ट्रिंग;) वी
46: वापसी
}
जैसा कि आप देख सकते हैं, यह एक बनाता है StringBuilder
और उपयोग करता है append
। यह बिल्ट-इन बफ़र की डिफ़ॉल्ट क्षमता के रूप में StringBuilder
केवल 16 वर्णों में डिफ़ॉल्ट रूप से अक्षम है , और संकलक के पास पहले से अधिक आवंटित करने के लिए जानने का कोई तरीका नहीं है , इसलिए यह वास्तविक रूप से समाप्त हो जाता है। यह विधि कॉल का एक गुच्छा भी है। (ध्यान दें कि JVM कभी-कभी कॉल के इन पैटर्नों का पता लगा सकता है और उन्हें फिर से लिख सकता है , हालांकि उन्हें अधिक कुशल बना सकता है।)
आइए देखें कि जावा 9 क्या उत्पन्न करता है:
सार्वजनिक वर्ग उदाहरण {
सार्वजनिक उदाहरण ();
कोड:
0: aload_0
1: invokespecial # 1 // विधि जावा / लंग / वस्तु। "<init>" :() वी
4: वापसी
सार्वजनिक स्थैतिक शून्य मुख्य (java.lang.String []);
कोड:
0: aload_0
1: iconst_0
2: एलाड
3: aload_0
4: iconst_1
५: अनलद
6: aload_0
7: iconst_2
8: अनलद
9: इनवॉक्लेनिस्टिक # 2, 0 // इनवोकेंडिऑनिक # 0: makeConcatWithConstants: (Ljava / lang / String; Ljava / lang / String; Ljava / lang / String?) Ljava / lang / String;
14: astore_1
15: getstatic # 3 // फ़ील्ड जावा / लैंग / सिस्टम.आउट: Ljava / io / PrintStream;
18: aload_1
19: invokevirtual # 4 // विधि जावा / io / PrintStream.println: (Ljava / lang / स्ट्रिंग;) वी
22: वापसी
}
ओह, लेकिन यह छोटा है। :-) यह एक एकल कॉल करता makeConcatWithConstants
है StringConcatFactory
, जो इसके जावदोक में कहता है:
स्ट्रिंग संघनन विधियों के निर्माण की सुविधा के लिए विधियाँ, जिनका उपयोग ज्ञात प्रकारों के तर्कों की एक संभावित संख्या को समझने के लिए किया जा सकता है, संभवतः प्रकार अनुकूलन और तर्कों के आंशिक मूल्यांकन के बाद। ये तरीके आमतौर पर कॉल साइटों के लिए बूटस्ट्रैप विधियों के रूप में उपयोग किए जाते हैं , जावा प्रोग्रामिंग लैंग्वेज invokedynamic
के स्ट्रिंग कॉन्सेप्टन फीचर का समर्थन करने के लिए।