2013-06-29 9 views
7
String str1="JAVA"; 
String str2="JAVA"; 
String str3=new String("JAVA"); 
String str4=new String("JAVA").intern(); 

2 ऑब्जेक्ट्स बनाए जाएंगे। str1 और str2 क्योंकि नए ऑपरेटर और str1 द्वारा एक ही वस्तु अंक के str4 अंक और स्ट्रिंग के लिए स्ट्रिंग पूल में str2 क्योंकि intern() विधि चेकों एक ही मूल्य होने का उपयोग कर, क्योंकि स्ट्रिंग शाब्दिक पूल अवधारणा और नई वस्तु को str3 अंक की एक ही वस्तु को देखें।प्रक्रिया में बनाए गए स्ट्रिंग ऑब्जेक्ट्स की कुल संख्या?

str1=str2=str3=str4=null; 

एक वस्तु जीसी के लिए योग्य होगी। यह वस्तु String str3=new String("JAVA") के माध्यम से बनाई गई है। स्ट्रिंग शाब्दिक पूल में संग्रहीत संदर्भ के माध्यम से पहली स्ट्रिंग ऑब्जेक्ट हमेशा पहुंच योग्य होती है।

क्या मेरी व्याख्या सही है?

उत्तर

12

प्रक्रिया में बनाए गए स्ट्रिंग ऑब्जेक्ट्स की कुल संख्या?

तीन: प्रशिक्षु पूल शाब्दिक के माध्यम से बनाया में एक और दो आप new String के माध्यम से पैदा करते हैं।

एक वस्तु जीसी के लिए योग्य होगी।

मैं दो गिनती, और संभवतः उपरोक्त तीनों के तहत बहुत विशेष परिस्थितियों:

  1. एक आप इस लाइन में बनाया:

    String str3=new String("JAVA"); 
    

    (आप बाद में str3 सेट के बाद से null पर)।

  2. एक आप इस लाइन में बनाया अस्थायी रूप से:

    String str4=new String("JAVA").intern(); 
    

    कि लाइन, एक नया String वस्तु बनाता है उस पर intern कहता है, और उसके बाद पूल से स्ट्रिंग के लिए एक संदर्भ की बचत होती है। तो सिद्धांत रूप में, यह String ऑब्जेक्ट बनाता है जो तुरंत जीसी के लिए उपलब्ध है। (JVM ऐसा करने के लिए पर्याप्त स्मार्ट हो सकता है, लेकिन यह सिद्धांत है।)

  3. संभावित रूप से, सही परिस्थितियों में, अंततः आंतरिक पूल में स्ट्रिंग भी। लोकप्रिय धारणा के विपरीत, इंटर्न पूल में तार कचरा संग्रह के लिए उपलब्ध हैं क्योंकि हम the answer to this other question से देख सकते हैं। सिर्फ इसलिए कि वे परमिट (unless you're using Oracle's JVM 7 or later) में हैं, इसका मतलब यह नहीं है कि वे the permgen is GC'd too के बाद से GC'd नहीं हैं। तो प्रश्न बन जाता है: कोड में उपयोग किए जाने वाले स्ट्रिंग शाब्दिक कब या कैसे संदर्भित किया जाता है? मुझे जवाब नहीं पता, लेकिन मुझे लगता है कि उचित धारणा होगी: जब और इसका उपयोग करने वाली कक्षा स्मृति से अनलोड हो जाती है। this other answer के अनुसार, यह केवल तभी हो सकता है जब कक्षा और उसके क्लासलोडर दोनों को अनलोड किया गया हो (और तब भी ऐसा नहीं हो सकता है)। अगर कक्षा को सिस्टम क्लासलोडर (सामान्य मामला) द्वारा लोड किया गया था, तो संभवतः यह कभी भी अनलोड नहीं होता है।

तो लगभग निश्चित रूप से केवल दो (# 1 और # 2 ऊपर), लेकिन यह मजेदार था # 3 में भी देख रहा था।

+0

वे सभी 'शून्य' पर सेट हैं। क्या जीसी उन सभी को एकत्र नहीं करना चाहिए क्योंकि सभी संदर्भ स्पष्ट रूप से 'शून्य' पर सेट हैं? – Maroun

+0

ओह .. ध्यान नहीं दिया :) कॉफी के लिए समय। – Maroun

+0

मैंने सुना है कि इंटर्न वाले स्ट्रिंग्स भी एकत्रित हैं - वे हमेशा के लिए परम मणि में नहीं हैं – dantuch

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