2011-12-20 11 views
5

मुझे पता चला कि Java supports constant folding of primitive types, लेकिन String के बारे में क्या?क्या जावा कंपाइलर में स्ट्रिंग कॉन्स्टेंट फोल्डिंग शामिल है?

उदाहरण

अगर मैं निम्नलिखित स्रोत कोड

out.write("" 
     + "<markup>" 
     + "<nested>" 
     + "Easier to read if it is split into multiple lines" 
     + "</nested>" 
     + "</markup>" 
     + ""); 

क्या संकलित कोड में चला जाता है बनाने के?

संयुक्त संस्करण? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

या कम कुशल रन-टाइम concatenation संस्करण? out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

+0

स्ट्रिंग कॉन्सटेनेशन डिवाइस पर लिखने से लगभग 100x तेज है। यह वास्तव में कोई फर्क नहीं पड़ता अगर यह नहीं (लेकिन यह करता है) –

+0

मैंने अभी इसे अपने लैपटॉप और उसके 50x गुना धीमा परीक्षण किया। –

+1

यह वास्तव में जेएलएस द्वारा आवश्यक व्यवहार है।/आप जनरेट कोड को 'javap -c' के साथ देख सकते हैं। –

उत्तर

14

यहाँ एक आसान परीक्षण है:

public static void main(final String[] args) { 
    final String a = "1" + "2"; 
    final String b = "12";   

    System.out.println(a == b); 
} 

आउटपुट:

true 

तो, हाँ, संकलक गुना होगा।

-1

इसे प्रभावी ढंग से तब्दील हो रहे हैं: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

1

संयुक्त संस्करण का उपयोग किया जाएगा।
संकलक इसे स्वचालित रूप से अनुकूलित करता है और इसे स्ट्रिंग पूल में रखता है।

आप इस लाइन को लिखकर आसानी से इस व्यवहार को साबित कर सकते हैं।

System.out.println("abc" == "a" + ("b" + "c")); // Prints true 

यह सच प्रिंट यही कारण है, इसका मतलब है कि यह एक ही वस्तुओं हैं।

  1. संकलक "abc" करने के लिए अनुकूलित "a" + ("b" + "c"): ऐसा इसलिए है क्योंकि की दो बातें है।
  2. कंपाइलर स्ट्रिंग पूल में सभी स्ट्रिंग अक्षर डालता है। इस व्यवहार को String Interning कहा जाता है।
+1

इस व्यवहार के पहले भाग को निरंतर अभिव्यक्ति मूल्यांकन कहा जाता है। – EJP

संबंधित मुद्दे