2012-06-03 9 views
8

मुझे यह पता नहीं लगा सकता है कि मैंने LinkedHashMap और विवरण से (हालांकि बहुत रोचक) पढ़ा है, मुझे समझ में नहीं आया कि यह वास्तव में हुड के नीचे अपना काम कैसे करता है। एक साइड नोट के रूप में, मुझे पता है कि जावा में नीचे HashMap काम करता है।
तो मैं स्रोत की समीक्षा करता हूं और अभी भी यह नहीं समझ सकता कि यह कैसे काम करता है। शायद मैं इस मामले में ओओपी में कुछ मौलिक समझ नहीं रहा हूं, इसलिए मेरे साथ बेकार है।
मुझे भ्रमित करने वाले भाग को संक्षेप में सारांशित करने के लिए निम्न है:
LinkedHashMap सभी कॉल अपने माता-पिता HashMap पर भेजता है।
आंतरिक यह HashMap.Entry ओवरराइड करता है विभिन्न recordAccess और recordRemoval तरीकों जो LinkedHashMap
लेकिन वास्तविक Entries के तर्क को लागू करने लगते हैं जो HashMap.Entry और नहीं की की एक तालिका को दर्शाता है यानी HashMap आधार वर्ग की तालिका के अंदर कर रहे हैं लागू करने के लिए LinkedHashMap.Entry
तो मैं यह नहीं समझ सकता कि विभिन्न recordAccess और recordRemove आदि वास्तव में कैसे कहा जा रहा है।
तो क्या कोई मुझे समझने में मदद कर सकता है कि यहां क्या हो रहा है?
क्या मुझे लगता है कि LinkedHashedMap.EntryHashMap द्वारा बनाई गई तालिका का प्रकार है? पर कैसे?ओओ मौलिक सिद्धांतों में वापस। LinkedHashMap हुड के नीचे कैसे काम करता है?

अद्यतन:
मेरा प्रश्न कैसे recordAccess कहा जा रहा है करना है। HashMap की एक व्युत्पन्न संस्करण का उपयोग कर इस पर मेरे प्रयोग Shengyuan लू के कारण (+1) के लिए असफल - मेरी खराब

अद्यतन:
जिसके बाद मैंने कोशिश की एक ही है (मुझे लगता है कि) के रूप में क्या LinkedHashMap कर रही है:

package delete; 

public class Base<T> { 

    Entry<T>[] table; 
    int idx = 0; 
    @SuppressWarnings("unchecked") 
    public Base(){ 
     System.out.println("In base"); 
     table = new Entry[10]; 
    } 

    public void add(T x){ 
     table[idx] = new Entry(x); 
     table[idx].doSomething(); 
    } 

    static class Entry<T>{ 
     T value; 

     Entry(T x){ 
      this.value = x; 
      System.out.println("Entry::Base"); 
     } 

     void doSomething(){ 
      System.out.println("In Entry base, doing something"); 
     } 
    } 

} 




public class Derived<T> extends Base<T> { 

    static class Entry<T> extends Base.Entry<T>{ 

     Entry(T x) { 
      super(x); 
      System.out.println("In Entry derived"); 
     } 

     int val; 

     @Override 
     void doSomething() { 
      System.out.println("In Entry derived doing something really smart!"); 
     }  
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Base<String> b = new Derived<String>(); 
     b.add("Test string"); 

    } 

} 

लेकिन यह प्रिंट:

In base 
Entry::Base  
In Entry base, doing something  

तो व्युत्पन्न Entry Nev है एर कहा जाता है।
क्या मेरा उदाहरण किसी भी तरह से अलग है? मुझे समझ में नहीं कर सकते कि यह कैसे के लिए LinkedHashMap

+0

सुरक्षित या पैकेज निजी? – assylias

+0

@assylias: _ के लिए अद्यतन ओपी – Cratylus

+2

_ क्यों लिंक किया हैशैप मैप को हैश मैप लागू करता है मैप_ पढ़ता है [यह] (http://stackoverflow.com/q/2165204/1393766) – Pshemo

उत्तर

3

काम करता है आप पैकेज java.util तहत MyLinkedHashMap को परिभाषित है, यह संकलन होगा;)

क्योंकि HashMap.HashEntry पैकेज दृश्यता है।

प्लस:

मैं प्रमुख बात हैरान आप LinkedHashMap.Entry बनाम HashMap.Entry है लगता है। बिंदु LinkedHashMap.Entry है - हैश मैप.एन्ट्री। दरअसल हैश मैपटेबल स्टोर्स LinkedHashMap.Entry LinkedHashMap में।

recordAccess और recordRemoval के संबंध में, वे दोनों HashMap.Entry संस्करणों को ओवरराइड करते हैं। आप LinkedHashMap और हैश मैप दोनों में संदर्भों को ढूंढ सकते हैं।

यहां टिप्पणियां मर्ज करें: आप नमूना कोड LinkedHashMap कार्यान्वयन के समान नहीं है। इसके बजाय LinkedHashMap.addEntry() देखें।

+0

में मदद की ज़रूरत है, लेकिन कैसे? 'हैश मैप' टेबल = नई प्रविष्टि [DEFAULT_INITIAL_CAPACITY] करता है; '। – Cratylus

+0

@ user384706 'ऑब्जेक्ट [] तालिका = नया ऑब्जेक्ट [1] के बारे में सोचें; टेबल [0] = "मैं ऑब्जेक्ट का उप-वर्ग हूं"; ' –

+0

कृपया OP – Cratylus

2

Ctrl + F आपका मित्र है, खासकर जब यह आपको एक साथ कई फाइलों को खोजने की अनुमति देता है। recordAccess को मानचित्र के put और get विधियों द्वारा एक्सेस/बनाई गई प्रविष्टि पर कॉल किया जाता है। (कॉल HashMap.put, HashMap.putForNullKey और LinkedHashMap.get में हैं।) यह केवल तभी प्रासंगिक है जब आप LinkedHashMap के निर्माता का उपयोग करते हैं जो एक बूलियन पैरामीटर लेता है और true को पास करता है। इसका प्रभाव यह है कि जब भी आप मानचित्र को छूते हैं, तो छुआ हुई प्रविष्टि आंतरिक लिंक्ड सूची के सामने ले जाया जाएगा।

एक विशेष निर्माता किसी लिंक किए गए हैश नक्शा जिसका यात्रा के क्रम में जिस क्रम में अपनी प्रविष्टियों पिछले पहुँचा रहे थे, से हाल ही सबसे कम करने के लिए पहुँचा सबसे हाल में (है बनाने के लिए प्रदान की जाती है:

प्रलेखन का हवाला देते हुए पहुंच से आदेश)। इस प्रकार का नक्शा एलआरयू कैश बनाने के लिए उपयुक्त है। पुट या विधि के परिणाम को इसी प्रविष्टि तक पहुंच में आमंत्रित करना (माना जाता है कि यह आमंत्रण पूर्ण होने के बाद मौजूद है)। PutAll विधि निर्दिष्ट मानचित्र में प्रत्येक मैपिंग के लिए एक प्रविष्टि पहुंच उत्पन्न करती है, ताकि कुंजी-मान मैपिंग निर्दिष्ट मानचित्र के एंट्री सेट इटरेटर द्वारा प्रदान की जा सकें। कोई अन्य तरीका प्रवेश पहुंच उत्पन्न नहीं करता है। विशेष रूप से, संग्रह-विचारों पर संचालन बैकिंग मानचित्र के पुनरावृत्ति के क्रम को प्रभावित नहीं करते हैं।

हटाए गए एल्डस्टेंट्री (मानचित्र। एंटर्री) विधि को मानचित्र में नए मैपिंग जोड़े जाने पर स्वचालित रूप से बाली मैपिंग को हटाने के लिए नीति लागू करने के लिए ओवरराइड किया जा सकता है।

इसी recordRemovalHashMap.removeEntryForKey और HashMap.removeMapping से कहा जाता है।

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

  • कोई संबंधित समस्या नहीं^_^