मूल रूप से, एक लूप का उपयोग करने से अधिक उस पर पुनरावृति ArrayList
करना एकमात्र विकल्प है:
इस कोड का उपयोग न करें, इस उत्तर की तह तक पढ़ना जारी रखें कि यह वांछनीय क्यों नहीं है, और इसके बजाय किस कोड का उपयोग किया जाना चाहिए:
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
String listString = "";
for (String s : list)
{
listString += s + "\t";
}
System.out.println(listString);
वास्तव में, एक स्ट्रिंग संघनन बस ठीक होने वाला है, क्योंकि javac
संकलक append
किसी StringBuilder
भी तरह से संचालन की एक श्रृंखला के रूप में स्ट्रिंग संघनन का अनुकूलन करेगा । यहाँ for
उपरोक्त कार्यक्रम से लूप से बाईटेकोड के डिस्सैम्ड का एक हिस्सा है :
61: new #13; //class java/lang/StringBuilder
64: dup
65: invokespecial #14; //Method java/lang/StringBuilder."<init>":()V
68: aload_2
69: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: aload 4
74: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
77: ldc #16; //String \t
79: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
82: invokevirtual #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
जैसा कि देखा जा सकता है, कंपाइलर उस लूप का उपयोग करके अनुकूलन करता है StringBuilder
, इसलिए प्रदर्शन को एक बड़ी चिंता नहीं होनी चाहिए।
(ठीक है, दूसरी नज़र में, StringBuilder
लूप के प्रत्येक पुनरावृत्ति पर त्वरित किया जा रहा है, इसलिए यह सबसे अधिक बाइटकोड नहीं हो सकता है। झटपट और स्पष्ट का उपयोग करना।StringBuilder
संभवतः बेहतर प्रदर्शन होगा।)
वास्तव में, मुझे लगता है कि किसी भी तरह का आउटपुट होना (डिस्क या स्क्रीन पर होना) कम से कम एक परिमाण धीमे का क्रम होगा, ताकि स्ट्रिंग के संघनन के प्रदर्शन की चिंता हो।
संपादित करें: जैसा कि टिप्पणियों में बताया गया है, उपरोक्त संकलक अनुकूलन वास्तव में StringBuilder
प्रत्येक पुनरावृत्ति पर एक नया उदाहरण बना रहा है । (जो मैंने पहले नोट किया है।)
उपयोग करने के लिए सबसे अधिक अनुकूलित तकनीक पॉल टॉम्बलिन द्वारा प्रतिक्रिया होगी , क्योंकि यह केवल लूप के StringBuilder
बाहर एक ही वस्तु को for
इंस्टेंट करता है।
उपरोक्त कोड के लिए:
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
StringBuilder sb = new StringBuilder();
for (String s : list)
{
sb.append(s);
sb.append("\t");
}
System.out.println(sb.toString());
केवल StringBuilder
लूप के बाहर एक बार इंस्टेंट कर देगा , और केवल दो कॉल को append
लूप के अंदर की विधि में कर देगा, जैसा कि इस बाइटकोड (जो StringBuilder
और लूप की तात्कालिकता को दर्शाता है ) में स्पष्ट है :
// Instantiation of the StringBuilder outside loop:
33: new #8; //class java/lang/StringBuilder
36: dup
37: invokespecial #9; //Method java/lang/StringBuilder."<init>":()V
40: astore_2
// [snip a few lines for initializing the loop]
// Loading the StringBuilder inside the loop, then append:
66: aload_2
67: aload 4
69: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: pop
73: aload_2
74: ldc #15; //String \t
76: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
79: pop
तो, वास्तव में हाथ का अनुकूलन बेहतर प्रदर्शन होना चाहिए, क्योंकि for
लूप के अंदर का हिस्सा छोटा होता है और StringBuilder
प्रत्येक पुनरावृत्ति पर तुरंत संकेत देने की आवश्यकता नहीं होती है ।