स्ट्रिंग अक्षर स्वचालित रूप से इंटर्न किए जाते हैं। इसलिए एस 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 मूल रूप से ढेर में बनाया गया था।
स्रोत
2011-09-20 02:15:43
चाहे वह ब्याज पारित हो या नहीं हो, लेकिन आपको यह नहीं करना चाहिए।'==' _object पहचान के लिए है, _ स्ट्रिंग तुलना नहीं है। – paxdiablo
@paxdiablo: यदि आप स्ट्रिंग अक्षर के साथ विशेष रूप से सौदा करते हैं, तो '==' का उपयोग करना ठीक है। लेकिन दस्तावेज करना आम तौर पर इतना दर्द है कि बोर्ड में 'बराबर() 'का उपयोग करना आसान है। –
हाँ, मैं उन सभी के बारे में जानता हूं। मैं वर्षों में जावा में प्रोग्रामिंग कर रहा हूं और बस सोच रहा था :)। ऐसा लगता है कि यह ऐसा नहीं होना चाहिए ... –