2012-12-15 37 views
6

यह कैसे काम करता है? मुझे कोई जवाब नहीं मिल रहा है।आदिम-बुलियन टू स्ट्रिंग कॉन्सटेनेशन/रूपांतरण

boolean bool=true; 
System.out.println("the value of bool is : " + true); 
//or 
System.out.println("the value of bool is : " + bool); 
  • क्या बातें दृश्य के पीछे जा रहे हैं कि कर रहे हैं?
  • बूलियन को बुलियन के रूप में स्ट्रिंग में कैसे डाला जाता है, यह प्रकार कास्ट नहीं किया जा सकता है?
  • ऑटोबॉक्सिंग/अनबॉक्सिंग शामिल है?
  • toString() या String.valueOf() जैसी विधियां किसी भी तरह से शामिल हैं?
+2

इस लेख को पढ़ें: http://www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation/ –

उत्तर

13

सटीक नियम जावा भाषा विशिष्टता में बाहर से लिखे गए हैं, §5.1.11. String Conversion

उन नियमों के अनुसार, "str" + bool के बराबर है समग्र अभिव्यक्ति का मूल्यांकन किया जाता है। JLS §15.18.1. String Concatenation Operator + से:

कार्यान्वयन बनाने और फिर एक मध्यवर्ती स्ट्रिंग वस्तु की निकालने से बचने के लिए एक ही चरण में रूपांतरण और संयोजन प्रदर्शन करने के लिए चुन सकते हैं। बार-बार स्ट्रिंग कॉन्सटेनेशन के प्रदर्शन को बढ़ाने के लिए, जावा कंपाइलर StringBuffer कक्षा या एक समान तकनीक का उपयोग कर सकता है ताकि अभिव्यक्ति के मूल्यांकन द्वारा बनाए गए इंटरमीडिएट String ऑब्जेक्ट्स की संख्या को कम किया जा सके।

आदिम प्रकारों के लिए, एक कार्यान्वयन सीधे एक आदिम प्रकार से एक स्ट्रिंग में परिवर्तित करके एक रैपर ऑब्जेक्ट के निर्माण को अनुकूलित कर सकता है।

उदाहरण के लिए, मेरी संकलक निम्नलिखित के साथ:

Code: 
    0: iconst_1  
    1: istore_1  
    2: getstatic  #59     // Field java/lang/System.out:Ljava/io/PrintStream; 
    5: new   #166    // class java/lang/StringBuilder 
    8: dup   
    9: ldc   #168    // String the value of bool is : 
    11: invokespecial #170    // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 
    14: iload_1  
    15: invokevirtual #172    // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder; 
    18: invokevirtual #176    // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    21: invokevirtual #69     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    24: return   
+1

यह तथ्य है कि दोनों कोड स्निपेट एक ही बाइटकोड बनाते हैं, इसका मतलब यह है कि पूर्व आईएस बाद में परिवर्तित हो गया है?(बाइटकोड में परिवर्तित होने से पहले, यह है) –

+0

@ विनी वाधवा मुझे नहीं लगता कि जेएलएस निर्दिष्ट करता है * कैसे * आपको स्ट्रिंग कॉन्सटेनेशन को लागू करना चाहिए - केवल परिणाम क्या होना चाहिए। हालांकि, जहां तक ​​मुझे याद है, स्नोरकल जावा कंपाइलर ने इसे 'स्ट्रिंगबफर', फिर एक 'स्ट्रिंगबिल्डर' का उपयोग करके कार्यान्वित किया है। स्ट्रिंग कॉन्सटेनेशन आपके JVM में एक आंतरिक ऑपरेशन होने के लिए शायद यह पूरी तरह स्वीकार्य है। – millimoose

+0

@ विनयवाधवा यह प्रतीत होता है [§15.18.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1): " बार-बार स्ट्रिंग कॉन्सटेनेशन के प्रदर्शन को बढ़ाने के लिए, जावा कंपाइलर स्ट्रिंगबफर क्लास या इसी तरह की तकनीक का उपयोग कर सकता है ... "और" आदिम प्रकारों के लिए, एक कार्यान्वयन एक रैपर ऑब्जेक्ट के निर्माण को भी अनुकूलित कर सकता है ... " – millimoose

2

यह एक कंपाइलर चीज है। यदि कॉन्सटेनेशन के लिए सही ऑपरेशन एक ऑब्जेक्ट है, तो ऑब्जेक्ट toString() विधि भेजा जाता है, जबकि यदि ऑपरेंड एक आदिम है तो संकलक जानता है कि किस प्रकार के विशिष्ट व्यवहार को आदिम को स्ट्रिंग में परिवर्तित करने के लिए उपयोग करना है।

"str" + new Boolean(bool).toString() 

जिसके अनुसार, संकलक में कैसे वास्तव में काफी छूट की अनुमति दी है:

+0

मैं देखता हूं .. क्या आप मुझे एक दस्तावेज में इंगित कर सकते हैं जो कहता है? –

+0

@ विनयवाधवा: संदर्भ के लिए मेरा उत्तर देखें। –

2

संकलक अनुवाद:

boolean bool = true; 
System.out.println(new StringBuilder("the value of bool is : ").append(bool).toString()); 

वे समान bytecodes में परिणाम:

boolean bool = true; 
System.out.println("the value of bool is : " + bool); 

बिल्कुल के बराबर है यह

पर है
StringBuilder sb = new StringBuilder("the value of bool is : "); 
sb.append(true); 
System.out.println(sb.toString()); 

संगतता और रूपांतरण के नियम the JLS में समझाए गए हैं।

+0

कौन सा कंपाइलर? हर कंपाइलर? यदि आप मुझे इस जानकारी के स्रोत पर इंगित कर सकते हैं, तो इसकी सराहना की जाएगी। आपके द्वारा प्रदान किया गया संदर्भ आपके उत्तर से संबंधित नहीं है, मुझे लगता है .. –

+0

यह कहता है: * एक कार्यान्वयन एक चरण में रूपांतरण और समापन निष्पादन करने के लिए चुन सकता है ताकि एक मध्यवर्ती स्ट्रिंग ऑब्जेक्ट को बना दिया जा सके। दोहराए गए स्ट्रिंग कॉन्सटेनेशन के प्रदर्शन को बढ़ाने के लिए, जावा कंपाइलर स्ट्रिंगबफर क्लास या एक समान तकनीक का उपयोग कर सकता है ताकि अभिव्यक्ति के मूल्यांकन द्वारा बनाए गए इंटरमीडिएट स्ट्रिंग ऑब्जेक्ट्स की संख्या को कम किया जा सके। * नियमों को जानने के लिए, जेएलएस पढ़ें। यह जानने के लिए कि यह वास्तव में कैसे काम करता है, अपने कंपाइलर द्वारा उत्पन्न बाइटकोड पढ़ें। –