2011-09-20 5 views
9

आप तीन तार,"स्ट्रिंग्स" के साथ दो स्ट्रिंग की तुलना: यह कब काम करेगा?

String s1 = "string one"; 
String s2 = new String("string one"); 
String s3 = "string one"; 

मैं जानता हूँ कि यह सच है कि s1 == s2false है सकते हैं, लेकिन मैंने कहीं पढ़ा है कि s1 == s3true है। क्या ये सही है? क्यों या क्यों नहीं?

+2

चाहे वह ब्याज पारित हो या नहीं हो, लेकिन आपको यह नहीं करना चाहिए।'==' _object पहचान के लिए है, _ स्ट्रिंग तुलना नहीं है। – paxdiablo

+0

@paxdiablo: यदि आप स्ट्रिंग अक्षर के साथ विशेष रूप से सौदा करते हैं, तो '==' का उपयोग करना ठीक है। लेकिन दस्तावेज करना आम तौर पर इतना दर्द है कि बोर्ड में 'बराबर() 'का उपयोग करना आसान है। –

+1

हाँ, मैं उन सभी के बारे में जानता हूं। मैं वर्षों में जावा में प्रोग्रामिंग कर रहा हूं और बस सोच रहा था :)। ऐसा लगता है कि यह ऐसा नहीं होना चाहिए ... –

उत्तर

21

स्ट्रिंग अक्षर स्वचालित रूप से इंटर्न किए जाते हैं। इसलिए एस 1 == एस 3 सच है। तारों को या तो स्ट्रिंग निरंतर पूल में बनाया जा सकता है या उन्हें ढेर अंतरिक्ष में बनाया जा सकता है। यदि आप ढेर में बनाई गई स्ट्रिंग को प्रशिक्षित करते हैं, तो स्ट्रिंग स्ट्रिंग निरंतर पूल में होगी।

जब आप एक स्ट्रिंग अक्षर (स्ट्रिंग एस 1 = "स्ट्रिंग वन") बनाते हैं, तो स्ट्रिंग निरंतर पूल में स्ट्रिंग बनाई जाती है। इसके अतिरिक्त, स्ट्रिंग निरंतर पूल डुप्लीकेट स्टोर नहीं करता है। तो जब आप कहते हैं,

String s1 = "string one"; 
String s3 = "string one"; 

दोनों एस 1 और एस 3 निरंतर पूल स्ट्रिंग में स्ट्रिंग का एक ही उदाहरण की ओर इशारा करते हो जाएगा। तो s1.equals (एस 3) सच होगा। और एस 1 == एस 3 भी सच है; चूंकि दोनों पॉइंटर्स समान हैं।

हालांकि

, जब आप एक स्ट्रिंग 'नई' निर्माता

String s2 = new String("string one"); 

तो s2 ढेर अंतरिक्ष में बनाई गई है का उपयोग कर का दृष्टांत। हीप स्पेस स्ट्रिंग निरंतर पूल

की तुलना में स्मृति का एक अलग क्षेत्र है, इसलिए s1.equals (s2) सत्य है, s1 == s2 गलत है; क्योंकि वे स्मृति के विभिन्न क्षेत्रों को इंगित करेंगे।

हालांकि, आप "नया" कन्स्ट्रक्टर का उपयोग करके बनाई गई स्ट्रिंग को इंटर्न() फ़ंक्शन का आविष्कार करके स्ट्रिंग निरंतर पूल में स्थानांतरित करने के लिए परिवर्तित कर सकते हैं। तो s2.intern() स्ट्रिंग निरंतर पूल में एक स्ट्रिंग लौटाएगा; हालांकि एस 2 मूल रूप से ढेर में बनाया गया था।

+0

पर मौत के लिए रुक गया है मुझे विश्वास है कि यह संकलन इकाइयों के भीतर ही सच है? यही है, मुझे अधिक सामान्य विश्वास नहीं है: 'एएक्स == बीएक्स' जरूरी है। –

+2

-1 भ्रामक, अर्थहीन पहली वाक्य और स्ट्रिंग इंटर्निंग का कोई उल्लेख नहीं है। –

+0

@pst: स्ट्रिंग इंटर्निंग सभी वर्गों में काम करता है। –

4

हां, यह सच है, क्योंकि स्ट्रिंग अक्षर सभी इंटर्न किए गए हैं। अधिक जानकारी के लिए String.intern() के लिए प्रलेखन पढ़ें।

परिणामस्वरूप, इन सभी का उद्देश्य एक ही कर रहे हैं (और == साथ बराबर की तुलना करेंगे):

s1 
s3 
s1.intern() 
s2.intern() 
s3.intern() 
1

ऊपर कैसे है।

और आपको पता होना चाहिए क्यों।

ए) स्ट्रिंग varaible विधि रेफरी द्वारा लगातार पूल

बी) स्ट्रिंग varaible परिणाम में लगातार करने के लिए संकलन समय रेफरी में घोषित ढेर अंतरिक्ष में वस्तु के लिए।

यह सब इसलिए क्योंकि जेवीएम specfication और इसकी स्मृति डिजाइन।

ए) इसलिए है क्योंकि स्ट्रिंग्स अपरिवर्तनीय हैं। जब जावा संकलन वर्ग और जेवीएम लोड क्लास, जेवीएम को कोडिंग समय में आपके द्वारा घोषित एक स्ट्रिंग वैरिएबल मिला। क्योंकि यह स्थिर है, जेवीएम स्थिरता को "रनटाइम कॉन्सटेंट पूल" मेमोरी एरिया में रखता है । और, निरंतर अद्वितीय है।

बी) बहुत ही सरल है। क्योंकि जेवीएम रनटाइम वैरिएबल हेप स्पेस का उपयोग करता है।

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