2012-09-09 18 views
7

मैं निम्नलिखित कार्यक्रम,जावा स्ट्रिंग समस्याओं

String firstString = "String"; 
    String secondString = "String"; 
    String thirdString = new String("String"); 
    System.out.println(firstString == secondString); 
    System.out.println(firstString == thirdString); 
    System.out.println(firstString.intern() == thirdString); 
    System.out.println(firstString.intern() == thirdString.intern()); 
    System.out.println(firstString.intern().equals(thirdString.intern())); 
    System.out.println(firstString == thirdString); 

भाग गया और मेरी उत्पादन

true 
false 
false 
true 
true 
false 

था मुझे पता चला है कि एक ही तारों के रूप में एक ही सामग्री के साथ JVM पूल स्ट्रिंग। क्या वह सही है? यदि यह सच है तो क्यों पहले स्ट्रिंग == तृतीयString झूठी वापसी नहीं? क्या जेवीएम केवल स्ट्रिंग को ही पूल करता है: "" और नए ऑपरेटर के साथ नहीं?

+0

यह भी प्रयास करें: 'firstString == thirdString.intern() ', यह देखने के लिए कि स्ट्रिंग अक्षर स्वचालित रूप से आंतरिक हैं। –

उत्तर

6

पूलिंग केवल स्ट्रिंग अक्षर से संबंधित है - इसलिए firstString और secondString वास्तव में वही वस्तु है - जहां thirdString में आपने स्पष्ट रूप से ढेर पर एक नई वस्तु बनाने के लिए कहा था।

मैं इस अनुभाग को string literals in the spec के बारे में पढ़ने की अनुशंसा करता हूं।

यह स्ट्रिंग पूल कैसे और कब पर अधिक जानकारी प्रदान करता है।

इसके अलावा, अनुभाग के अंत में इन गोलियों को ध्यान दें:

  • एक ही पैकेज में एक ही कक्षा (§8) के भीतर शाब्दिक तार (§7) एक ही स्ट्रिंग लिए संदर्भ का प्रतिनिधित्व वस्तु (§4.3.1)।
  • एक ही पैकेज में विभिन्न वर्गों के भीतर शाब्दिक तार एक ही स्ट्रिंग ऑब्जेक्ट के संदर्भ प्रस्तुत करते हैं।
  • अलग-अलग हिस्सों में विभिन्न वर्गों के भीतर शाब्दिक तार समान स्ट्रिंग ऑब्जेक्ट के संदर्भों का प्रतिनिधित्व करते हैं।
  • निरंतर अभिव्यक्तियों (§15.28) द्वारा गणना की गई स्ट्रिंग्स संकलित समय पर गणना की जाती हैं और फिर इलाज की जाती हैं जैसे कि वे शाब्दिक थे।
  • रन टाइम पर कॉन्सटेनेशन द्वारा गणना की गई स्ट्रिंग नव निर्मित और इसलिए अलग हैं।
+0

ठीक है मैं आपकी व्याख्याओं से सहमत हूं। मैंने ढेर में "स्ट्रिंग" के साथ तीसरे ऑब्जेक्ट के रूप में एक नई वस्तु बनाई है। मैंने इसे प्रशिक्षित किया है। तो पूल में दो वस्तुएं सही होंगी? पहला और सेकोंग स्ट्रिंग ऑब्जेक्ट ए (उद्धरण के लिए) का संदर्भ देगा और तीसरा दूसरा (बी) देखेंगे। – vvekselva

0

thirdString पूल से नहीं है। यह एक स्ट्रिंग अक्षर नहीं है, आपने गतिशील रूप से इसे new ऑपरेटर के साथ बनाया है।

secondString दूसरी तरफ - पूल से लिया जाता है (आप इसे एक स्ट्रिंग अक्षरशः असाइन करते हैं), इसलिए उसी ऑब्जेक्ट को firstString और secondString दोनों को असाइन किया गया है।

-1

"firstString == thirdString" झूठी रिटर्न देता है।

विधि इंटर्न "स्ट्रिंग ऑब्जेक्ट के लिए एक कैननिकल प्रतिनिधित्व देता है।" आप प्रशिक्षु स्ट्रिंग असाइन करते हैं:

thirdString=thirdString.intern(); 

पिछले "firstString == thirdString" सच

2

रिटर्न firstString और secondString के लिए, JVM स्ट्रिंग पूल देखने और "STRING" के संदर्भ वापस आ जाएगी।

थर्डस्ट्रिंग के लिए, JVM स्ट्रिंग पूल नहीं देखेगा और केवल ढेर में स्ट्रिंग ऑब्जेक्ट बनाएगा।

OneString.intern() के लिए, JVM स्ट्रिंग पूल में संदर्भ को देखेगा, स्ट्रिंग पूल में OneString जोड़ देगा यदि OneString इसमें मौजूद नहीं है, और संदर्भ वापस करें।

+0

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

+0

इंटर्न() को कॉल करने के बाद, स्ट्रिंग पूल में स्ट्रिंग को जोड़ा जाएगा और स्ट्रिंग ऑब्जेक्ट स्ट्रिंग पूल में नए स्ट्रिंग संदर्भ को संदर्भित करेगा। अगली बार जीसी द्वारा मूल स्ट्रिंग ऑब्जेक्ट एकत्र किया जाएगा। –

+0

क्या यह प्रोफ़ाइल करने के लिए कोई तरीका है? मैं सिर्फ इंटर्न पूल की सामग्री देखना चाहता हूं? क्या कोई तरीका है? – vvekselva

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