2011-03-24 16 views
8

जावा के पीछे यांत्रिकी स्ट्रिंग अक्षरों को स्ट्रिंग ऑब्जेक्ट्स के रूप में स्वचालित रूप से व्याख्या करने के लिए क्या हैं, क्योंकि कोई ओवरलोडेड ऑपरेटर नहीं हैं और निम्न-स्तरीय स्ट्रिंग बफर (उच्च स्तरीय स्ट्रिंगबफर सहित) के लिए कोई डिफ़ॉल्ट समर्थन नहीं है? क्या यह एक भाषा या आभासी मशीन संदर्भ है?जावा स्ट्रिंग शाब्दिक स्वचालित रूप से स्ट्रिंग ऑब्जेक्ट के रूप में व्याख्या की गई, लेकिन कैसे?

उत्तर

6

यह दोनों का एक छोटा सा है।

जेवीएम में रनटाइम स्टैक पर स्ट्रिंग अक्षर को लोड करने के लिए बाइट कोड हैं, और इन ऑपोड्स को जेएमवी स्पेक में निर्दिष्ट किया गया है ताकि एक उचित रूप से निर्मित स्ट्रिंग ऑब्जेक्ट को स्टैक पर दबाकर काम किया जा सके, जिनकी सामग्री कुछ स्ट्रिंग अक्षर के बराबर है वर्ग फ़ाइल। स्ट्रिंग ऑब्जेक्ट को इंटर्न करने के अलावा यह कैसे किया जाता है इसके अलावा कोई विनिर्देश नहीं है, जिसका अर्थ है कि परिवर्तन कार्यान्वयन-विशिष्ट है।

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

+0

वहाँ किसी भी तरह से एक सीखने के रूप में जावा बाइट कोड में प्रोग्राम (विधानसभा भाषा के कुछ प्रकार के लिए समान) लिखने के लिए है व्यायाम? – TurtleToes

+1

@ टर्टलटोस: हां, [जैस्मीन] का उपयोग करके (http://jasmin.sourceforge.net/)। –

+0

महान। बहुत बहुत धन्यवाद। यह दिलचस्प होगा – TurtleToes

3

जावा वास्तव में कुछ अधिभारित ऑपरेटरों के पास है। उदाहरण के लिए, + स्ट्रिंग ऑब्जेक्ट्स के साथ-साथ int, float, और अन्य संख्यात्मक प्रकारों पर भी लागू किया जा सकता है। प्रत्येक मामले में, वापसी प्रकार को + के प्रत्येक पक्ष पर अभिव्यक्ति के प्रकार द्वारा परिभाषित किया जाता है। हालांकि, सभी अधिभारित ऑपरेटरों को भाषा में पूर्वनिर्धारित किया गया है; प्रोग्रामर के पास किसी अन्य को परिभाषित करने के लिए भाषा में कोई तंत्र नहीं है। विवरण के लिए language specification देखें।

+0

जो भी इसे कम करता है ... समझाने की देखभाल क्यों? –

+0

मुझे नहीं, क्षमा करें। मैं यह सुझाव देने के लिए नीचे आ गया कि किसी ने इसे नष्ट करने और धागे के नए उदाहरण बनाने के बजाय धागे को रोक दिया और फिर से शुरू किया, और कोई भी यह बताने के लिए नहीं आया कि क्यों। – TurtleToes

+0

@ टर्टलटोस: मैंने एक टिप्पणी लिखी है कि आपका जवाब भयानक क्यों था (लेकिन मैं वह नहीं था जिसने आपको नीचे गिरा दिया, शायद वे खुद को दिखाएंगे या नहीं)। –

0

मूल रूप से संकलक आपके कोड को फिर से लिखता है।

z = new StringBuffer(z).append(" with some more in it").toString(); 

अब एक concat के लिए इस एक वस्तु है:

z += " with some more in it"; 

के रूप में संकलित किया गया है:

String x = "Some String"; 

संयोजन के लिए, यह StringBuffer संलग्न विधि के लिए बस वाक्यात्मक चीनी, इस यानी है बनाया गया और 2 विधि कॉल, इसलिए यदि आप लूप के अंदर एक बहुत लंबी स्ट्रिंग बना रहे हैं, तो यह लिखने के लिए एफएआर अधिक कुशल है:

StringBuilder buf = new StringBuilder(); // Not synchronized so quicker than StringBuffer 
while (condition is true) 
    buf.append(...); 
String z = buf.toString(); 

बजाय:

String z = ""; 
while (condition is true) 
    z += "..."; 

संपादित करें: हटाया गलत कोड उदाहरण ...

+2

नहीं, "मैं एक स्ट्रिंग हूं" '_ot_' नया स्ट्रिंग है (" मैं एक स्ट्रिंग हूं ")'; यदि ऐसा होता है, तो आपको 'स्ट्रिंग' कन्स्ट्रक्टर को असीमित रिकर्सिव कॉल मिलेंगे! –

+1

एक मामूली विस्तार - सभी स्ट्रिंग अक्षरों को प्रशिक्षित किया जाता है, इसलिए एक स्ट्रिंग अक्षर एक नई स्ट्रिंग बनाने जैसा ही नहीं है। यह एक ही मूल्य के साथ सभी स्ट्रिंग अक्षरों द्वारा साझा स्ट्रिंग इंस्टेंस को वापस रखेगा। – templatetypedef

+1

@templatetypedef: असल में, यह एक महत्वपूर्ण जानकारी है। मैं कभी-कभी उस कोड को लिखता हूं जो उस संपत्ति का शोषण करता है: उदाहरण के लिए, यदि मुझे पता है कि मैं दो चर की तुलना कर रहा हूं जो मुझे पता है स्ट्रिंग अक्षर हैं या अन्यथा आंतरिक हैं, तो मैं पहचान तुलना का उपयोग करता हूं। –

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