2012-09-16 93 views
5

जब आप int जैसे आदिम के साथ एक स्ट्रिंग को संयोजित करते हैं, तो यह ऑटोबॉक्स मान पहले होता है।जावा में स्ट्रिंग कंसटेनेशन और ऑटोबॉक्सिंग

पूर्व।

String string = "Four" + 4; 

यह कैसे जावा में एक स्ट्रिंग के लिए मूल्य में परिवर्तित करता है?

+0

आप किस भाषा का उपयोग कर रहे हैं? [स्ट्रिंग concat] [1] [1]: – skunkfrukt

+0

मेरे लिए – TeaOverflow

+0

अगर आपके यहाँ देखो, सी # के बारे में बात जावा की तरह लग रहा http: // stackoverflow।कॉम/प्रश्न/33 9 8604/स्ट्रिंग-स्ट्रिंग-इंट-व्हाट्स-बैक-द-सीन-सी – meirrav

उत्तर

5

देखने के लिए क्या जावा कम्पाइलर का उत्पादन यह हमेशा javap -c उपयोग करने के लिए वास्तविक बाईटकोड उत्पादित दिखाने के लिए उपयोगी है:

उदाहरण के लिए निम्नलिखित जावा कोड:

String s1 = "Four" + 4; 
int i = 4; 
String s2 = "Four" + i; 

निम्नलिखित बाईटकोड उत्पादन होगा:

0: ldc  #2; //String Four4 
    2: astore_1 
    3: iconst_4 
    4: istore_2 
    5: new  #3; //class java/lang/StringBuilder 
    8: dup 
    9: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    12: ldc  #5; //String Four 
    14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ 
String;)Ljava/lang/StringBuilder; 
    17: iload_2 
    18: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan 
g/StringBuilder; 
    21: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la 
ng/String; 
    24: astore_3 
    25: return 

इस से हम देख सकते हैं:

  • "Four" + 4 के मामले में, जावा (मैं JDK 6 का उपयोग किया गया था) के लिए पर्याप्त चतुर अनुमान है कि यह एक निरंतर है था, इसलिए क्रम में कोई कम्प्यूटेशनल प्रयास, वहाँ है के रूप में स्ट्रिंग संकलन समय
  • पर concatenated है "Four" + i के मामले में, बराबर कोड new StringBuilder().append("Four").append(i).toString()
  • autoboxing यहाँ शामिल नहीं है के रूप में वहाँ है एक StringBuilder.append(int) तरीका है जिसके डॉक्स के अनुसार पूर्णांक की स्ट्रिंग प्रतिनिधित्व बनाने के लिए String.valueOf(int) उपयोग कर रहा है।
4

जावा कंपाइलर वास्तव में StringBuilder बनाता है और append() विधि को आमंत्रित करता है। यह बाइट-कोड में देखा जा सकता है:

22 invokespecial java.lang.StringBuilder(java.lang.String) [40] 
... 
29 invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [47] 
32 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [51] 

फिर भी, व्यवहार मुक्केबाजी के समान और उसके बाद लागू toString() है: "Four" + new Integer(4).toString() - जो मेरा मानना ​​है कि क्या भाषा डिजाइनरों मन में था।


(1) सटीक होना, संकलक पहले से ही स्ट्रिंग शाब्दिक और एक एकल स्ट्रिंग शाब्दिक "Four4" को पूर्णांक शाब्दिक concatting है। आप बाइट-कोड में निम्न पंक्ति में बाइट कोड में देख सकते हैं:

0 ldc <String "Four4"> [19] 
0

अनुसार http://jcp.org/aboutJava/communityprocess/jsr/tiger/autoboxing.html को, autoboxing आदिम प्रकार पर किया जाता है, जब भी एक संदर्भ प्रकार की जरूरत है (जैसे कि इस मामले में पूर्णांक वर्ग के रूप में)

तो int इंटीजर में परिवर्तित हो जाएगा, तो पूर्णांक ऑब्जेक्ट टूस्ट्रिंग() विधि को कॉल किया जाता है और इसका परिणाम पिछली स्ट्रिंग में जोड़ा जाता है।