2012-05-15 10 views
15

मैंWeakHashMap उदाहरण

WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>(); 
map.put(emp,"hello"); 

जहां रोजगार एक कर्मचारी ऑब्जेक्ट है के रूप में एक WeakHashMap पैदा करते हैं। अब अगर मैं emp = null या कहता हूं कि emp ऑब्जेक्ट का संदर्भ नहीं दिया गया है, तो क्या प्रविष्टि को WeakHashMap से हटा दिया जाएगा यानी मानचित्र का आकार शून्य होगा?
और हैश मैप के मामले में यह विपरीत होगा?
क्या WeakHashMap की मेरी समझ सही है?

उत्तर

6

मैं HashMap और WeakHashMap

  Map hashMap= new HashMap(); 
      Map weakHashMap = new WeakHashMap(); 

      String keyHashMap = new String("keyHashMap"); 
      String keyWeakHashMap = new String("keyWeakHashMap"); 

      hashMap.put(keyHashMap, "helloHash"); 
      weakHashMap.put(keyWeakHashMap, "helloWeakHash"); 
      System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap")); 

      keyHashMap = null; 
      keyWeakHashMap = null; 

      System.gc(); 

      System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap")); 
के बीच अंतर को समझने के लिए नमूना कोड भाग गया

आउटपुट होगा:

Before: hash map value:helloHash and weak hash map value:helloWeakHash 
After: hash map value:helloHash and weak hash map value:null 
6

* प्रवेश को वीकशैश मैप से हटा दिया जाएगा यानी मानचित्र का आकार शून्य होगा? *

हैं emp पिछले कर्मचारी strongly reachable तो नक्शा में प्रवेश हटाया जा सकता है बनाने संदर्भ निहित।

जावा डॉक्स यह सार बहुत अच्छी तरह से:

एक hashtable आधारित कमजोर कुंजी के साथ नक्शा कार्यान्वयन। WeakHashMap में एक प्रविष्टि स्वचालित रूप से हटा दी जाएगी जब इसकी कुंजी अब सामान्य उपयोग में नहीं है। अधिक सटीक रूप से, किसी दिए गए कुंजी के लिए मैपिंग की उपस्थिति कचरा कलेक्टर द्वारा छोड़ी जाने वाली कुंजी को रोक नहीं पाएगी [...]। जब एक कुंजी को त्याग दिया गया है तो इसकी प्रविष्टि प्रभावी रूप से मानचित्र से हटा दी जाती है, इसलिए यह वर्ग अन्य मानचित्र कार्यान्वयन से कुछ अलग तरीके से व्यवहार करता है।

 

और यह HashMap के मामले में उपाध्यक्ष प्रतिकूल हो जाएगा?

WeakHashMap से प्रविष्टि को हटाने से प्रोग्राम में किसी भी अन्य संदर्भ को प्रभावित नहीं होगा।

+0

हाँ, एक WeakHashMap वस्तुओं के लिए कमजोर संदर्भ शामिल हैं। कचरा कलेक्टर यह पता लगाता है कि (और अन्य कमजोर संदर्भ) वस्तु के आखिरी शेष संदर्भ हैं, तो एक कमजोर संदर्भ में यह सूचक "ज़ेड" होता है। लेकिन यह केवल कुछ जीसी चक्रों पर होता है। ऑफहैंड, मुझे नहीं पता कि यह होने पर मानचित्र की गिनती के साथ क्या होता है। –

+0

@aioobe "अगर emp में कर्मचारी अंतिम रूप से पहुंचने योग्य अंतिम संदर्भ शामिल करता है तो मानचित्र में प्रविष्टि को हटाया जा सकता है।" मुझे यह नहीं मिला। क्या आप कृपया और विस्तार से बता सकते हैं? – Anand

+0

@anand, अगर 'emp' एकमात्र चर था जो कुछ 'कर्मचारी' (अन्य * कमजोर * संदर्भों के अलावा हैश मैप में से एक के संदर्भ में) के लिए संदर्भित किया गया था, तो 'emp = null' करने से कर्मचारी को प्रश्न में रखा जाएगा कचरा संग्रह के लिए पात्र। [पहुंच क्षमता] पर पढ़ें (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html#reachability)। – aioobe

35

एक बहुत ही सरल उदाहरण के लिए, स्पष्ट करने के क्या पहले से ही कहा गया है:

import java.util.WeakHashMap; 

public class WeakHashMapDemo { 

    public static void main(String[] args) { 
     // -- Fill a weak hash map with one entry 
     WeakHashMap<Data, String> map = new WeakHashMap<Data, String>(); 
     Data someDataObject = new Data("foo"); 
     map.put(someDataObject, someDataObject.value); 
     System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject)); 

     // -- now make someDataObject elligible for garbage collection... 
     someDataObject = null; 

     for (int i = 0; i < 10000; i++) { 
      if (map.size() != 0) { 
       System.out.println("At iteration " + i + " the map still holds the reference on someDataObject"); 
      } else { 
       System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty"); 
       break; 
      } 
     } 
    } 

    static class Data { 
     String value; 
     Data(String value) { 
      this.value = value; 
     } 
    } 
} 

आउटपुट:

map contains someDataObject ? true 
    ... 
    At iteration 6216 the map still holds the reference on someDataObject 
    At iteration 6217 the map still holds the reference on someDataObject 
    At iteration 6218 the map still holds the reference on someDataObject 
    somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty 
+0

मेरे लिए यह बहुत अधिक समय लगा! कार्यक्रम को बदलना था :) "सोमडाटा ऑब्जेक्ट अंततः 7086 9 3 पर कचरा इकट्ठा किया गया है, इसलिए नक्शा अब खाली है" –

+0

@ यानफ्लिया मुझे आश्चर्य हुआ कि मानचित्र में कमजोर संदर्भ के साथ क्या होगा जब वास्तविक संदर्भ जीसीड है । आपके उदाहरण ने यह बेहद स्पष्ट किया कि कमजोर रेफरी को मानचित्र से हटा दिया जाएगा। अनेक अनेक धन्यवाद। – tMJ

1

जावा में संदर्भ स्मृति पता है जहां बनाई गई वस्तुएं स्मृति में इंगित करती हैं। WeakHashMap में, कमजोर संदर्भ की अवधारणा का उपयोग किया जाता है।

जैसे ही आप जावा में कोई ऑब्जेक्ट बनाते हैं और इसे कुछ चर के लिए असाइन करते हैं, यह दृढ़ता से पहुंच योग्य हो जाता है।

कमजोर संदर्भ वस्तु कुछ हद तक उस वस्तु के समान हो सकती है जिसमें कोई स्मृति संदर्भ नहीं है यानी यह अब कचरा हो सकता है।

1

अन्य मानचित्र कार्यान्वयन जैसे हैश मैप, चाबियाँ दृढ़ता से पहुंच योग्य हैं।उदाहरण के लिए, यदि हैश मैप में नीचे दिखाए गए व्यक्ति वर्ग के रूप में चाबियाँ हैं और यदि व्यक्ति ऑब्जेक्ट को शून्य पर सेट किया गया है, तो इसके बाद भी अगर हम नक्शा करेंगे .get (व्यक्ति) हमें स्मृति से मूल्य प्राप्त होगा क्योंकि चाबियाँ दृढ़ता से संदर्भित हैं हैश मैप में

wm.put(person, person.getFirstName()); 
person = null; 
System.gc(); 
System.out.println("Hash Map :" + wm.toString()); 

आउटपुट: हैश मानचित्र: {} [email protected]=John

HashMap की तुलना में, WeakHashMap एक के रूप में कुंजी स्मृति में कोई संदर्भ है जो अपनी enteries रूप में जल्द ही निकाल देंगे है। उदाहरण के लिए, यदि वीक हैशैप के पास नीचे दिखाए गए व्यक्ति वर्ग के रूप में चाबियाँ हैं और यदि व्यक्ति वस्तु शून्य पर सेट की गई है, तो अब यदि आप map.get (व्यक्ति) करते हैं तो हम इससे बाहर निकल जाएंगे क्योंकि कुंजी का कोई संदर्भ नहीं है (या बल्कि कमजोर पहुंच योग्य)।

wm.put(person, person.getFirstName()); 
person = null; 
System.gc(); 
System.out.println("Weak Hash Map :" + wm.toString()); 

आउटपुट: कमजोर हैश मानचित्र: {}

0

WeakHashMap उदाहरण:

Map map = new WeakHashMap(); 
Foo foo = new Foo(); 
map.put(foo, "bar"); 
foo=null; // strong refrence is removed and object is available for garbage collection. 

HashMap उदाहरण:

Map map = new HashMap(); 
Foo foo = new Foo(); 
map.put(foo, "bar"); 
foo=null; // even though the reference is nullified object will not garbage collected because map is having Strong refrence. 
संबंधित मुद्दे