2010-02-01 10 views
8

एक साक्षात्कार प्रश्न में, साक्षात्कारकर्ता ने मुझसे पूछाअसाइनमेंट और स्ट्रिंग के इंस्टेंस बनाने के बीच क्या अंतर है?

निम्नलिखित कथनों के बीच सामान्य और अंतर क्या है:

String s = "Test"; 

String s = new String("Test"); 

क्या स्मृति आवंटन में कोई अंतर है?

+0

http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression- new-string-in-java –

उत्तर

6
String s = "Test"; 

पहले स्ट्रिंग निरंतर पूल में स्ट्रिंग "टेस्ट" की तलाश करेगा। यदि पाए गए वस्तु को संदर्भित वस्तु के संदर्भ में बनाया जाएगा। यदि नहीं मिला, तो एक नई स्ट्रिंग ऑब्जेक्ट बनाई गई है, पूल में जोड़ा गया है और नए बनाए गए ऑब्जेक्ट को संदर्भित करने के लिए बनाया गया है।

String s = new String("Test"); 

पहले एक नई स्ट्रिंग ऑब्जेक्ट बनायेगा और इसे संदर्भित करेगा। इसके अतिरिक्त स्ट्रिंग "टेस्ट" स्ट्रिंग निरंतर पूल, में में पहले से मौजूद नहीं है, तो स्ट्रिंग "टेस्ट" के लिए एक प्रविष्टि बनाई गई है।

तो मानते हैं कि स्ट्रिंग "टेस्ट" पूल में नहीं है, पहली घोषणा एक वस्तु बनायेगी जबकि दूसरा दो ऑब्जेक्ट बनाएगा।

+1

जैसा कि मैं इसे समझता हूं, निरंतर में लुकअप/ऑब्जेक्ट सृजन पूल उस वर्ग के कोड में होने वाले सभी अक्षरों के लिए होता है जब उस वर्ग को लोड किया जाता है, न कि जब उस विशेष पंक्ति कोड को निष्पादित किया जाता है। –

5

स्मृति की अवधि में भिन्नता यह है कि फॉर्म की अभिव्यक्ति: String s = "test" अद्वितीय घटनाओं को साझा करने के लिए "आंतरिक" स्ट्रिंग का उपयोग करती है।

प्रपत्र के आह्वान: String s = "test"
String s = new String("test")

पहली कॉल मौजूदा निरंतर अभिव्यक्ति का उपयोग करता है, (यदि वहाँ एक है) दूसरी कॉल का इस्तेमाल कर रही बिना एक नया उदाहरण बनाता है की तुलना में कुशल है कोई मौजूदा उदाहरण

कोड हिस्सा नीचे इस दर्शाता है:

String test = new String("test"); 
String internTest = "test"; 
String nonInternTest = new String("test"); 

System.out.println(test == internTest); // prints false 
System.out.println(test != nonInternTest); // prints true 
System.out.println(test.equals(nonInternTest)); // prints true 

भी ध्यान रखें कि JLS व्यवहार निर्दिष्ट करता है इस प्रकार हो:
प्रत्येक स्ट्रिंग शाब्दिक वर्ग स्ट्रिंग का एक उदाहरण (§4.3.3 लिए एक संदर्भ है)। स्ट्रिंग ऑब्जेक्ट्स का निरंतर मूल्य होता है। स्ट्रिंग अक्षर-या, अधिक आम तौर पर, स्ट्रिंग्स जो निरंतर अभिव्यक्तियों के मान हैं, "interned" हैं ताकि विधि String.intern का उपयोग करके अद्वितीय उदाहरण साझा कर सकें।

0

स्ट्रिंग पूल में स्ट्रिंग शाब्दिक "टेस्ट" की खोज करेगा, अगर यह मौजूद है तो वह इसका उल्लेख करेगा और नया नहीं बनाएगा। और केवल नई वस्तु बनाता है जब "टेस्ट" शाब्दिक नहीं होता है।

लेकिन दूसरे मामले में यह किसी अन्य वस्तु को बनाएगा चाहे वह मौजूद है या नहीं।

1

स्ट्रिंग एस = "टेस्ट"; // एक स्ट्रिंग ऑब्जेक्ट बनाता है और एक संदर्भ चर इस साधारण मामले में, "टेस्ट" पूल में जाएगा और इसका उल्लेख होगा।

स्ट्रिंग एस = नया स्ट्रिंग ("टेस्ट"); // दो ऑब्जेक्ट्स और एक संदर्भ चर बनाता है इस मामले में, क्योंकि हमने नया कीवर्ड इस्तेमाल किया है, जावा सामान्य (गैर-पूल) मेमोरी में एक नई स्ट्रिंग ऑब्जेक्ट बनाएगा, और इसका उल्लेख होगा। इसके अलावा, शाब्दिक "टेस्ट" पूल में रखा जाएगा।

लेकिन उनके पास आम बात यह है कि वे सभी "टेस्ट" के मान के साथ एक नई स्ट्रिंग ऑब्जेक्ट बनाते हैं, और इसे संदर्भ चर के लिए असाइन करते हैं।

0

+ एक नया स्ट्रिंग ऑब्जेक्ट बनाने और संदर्भ बनाने के बीच भिन्नता कुछ भी नहीं है, लेकिन हम एक नई वस्तु बनाने के लिए jvm को बता रहे हैं। और रिफेंस बनाने का अर्थ है कि हम केवल अपना ऑब्जेक्ट बना रहे हैं।

+0

कोई प्रश्न नहीं। – Luv

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