2011-08-18 34 views
27

हैश मैप सीरियलज़ेबल इंटरफ़ेस लागू करता है; इसलिए इसे क्रमबद्ध किया जा सकता है। मैंने हैश मैप के कार्यान्वयन को देखा है और प्रविष्टि [] तालिका को क्षणिक के रूप में चिह्नित किया गया है। चूंकि प्रविष्टि [] तालिका वह है जो मानचित्र की पूरी सामग्री को संग्रहीत करती है और यदि इसे क्रमबद्ध नहीं किया जा सकता है, तो मानचित्र को डी-सीरियलाइजेशनहैश मैप सीरियलज़ेबिलिटी

उत्तर

32

के दौरान वापस बनाया गया है यदि आप the source पर देखते हैं तो आप देखेंगे कि यह नहीं है डिफ़ॉल्ट क्रमबद्धता तंत्र पर भरोसा करते हैं, लेकिन इसे मैन्युअल बाहर सभी प्रविष्टियों लिखते हैं (कुंजी और मूल्यों का एक वैकल्पिक धारा के रूप में):

/** 
    * Save the state of the <tt>HashMap</tt> instance to a stream (i.e., 
    * serialize it) 
    * 
    * @serialData The <i>capacity</i> of the HashMap (the length of the 
    *    bucket array) is emitted (int), followed by the 
    *    <i>size</i> (an int, the number of key-value 
    *    mappings), followed by the key (Object) and value (Object) 
    *    for each key-value mapping. The key-value mappings are 
    *    emitted in no particular order. 
    */ 
     private void writeObject(java.io.ObjectOutputStream s) 
      throws IOException 
     { 
      Iterator<Map.Entry<K,V>> i = 
       (size > 0) ? entrySet0().iterator() : null; 

      // Write out the threshold, loadfactor, and any hidden stuff 
      s.defaultWriteObject(); 

      // Write out number of buckets 
      s.writeInt(table.length); 

      // Write out size (number of Mappings) 
      s.writeInt(size); 

      // Write out keys and values (alternating) 
      if (i != null) { 
       while (i.hasNext()) { 
        Map.Entry<K,V> e = i.next(); 
        s.writeObject(e.getKey()); 
        s.writeObject(e.getValue()); 
       } 
      } 
     } 

इस सरणी है, जो कई खाली प्रविष्टियों और लिंक चेन और शामिल कर सकते हैं की तुलना में अधिक कॉम्पैक्ट है मानचित्र $ प्रविष्टि रैपर के लिए ओवरहेड।

ध्यान दें कि यह अभी भी "आसान" फ़ील्ड के लिए defaultWriteObject को आमंत्रित करता है। काम करने के लिए, इसे transient के रूप में अन्य सभी को चिह्नित करना होगा।

+0

मुझे यह दिलचस्प लगता है कि हैश मैप का लोड कारक क्रमबद्ध नहीं है। तो यह जानकारी खो रही है। –

+1

@ पीटर Wippermann: क्या आप निश्चित हैं? यह 'loadFactor' क्षणिक नहीं है, इसे' defaultWriteObject' द्वारा उत्पादित आउटपुट में निहित होना चाहिए। (वास्तव में, डिफ़ॉल्ट रूप से कॉल से पहले स्रोत में टिप्पणी WriteObject सीधे इसका उल्लेख करती है)। – Thilo

+1

ओह आप बिल्कुल सही हैं! मैंने ध्यान नहीं दिया, कि यह डिफ़ॉल्ट क्रमिकरण से प्रभावित होगा। मुझे यह इंगित करने के लिए धन्यवाद! :-) –

8

HashMapwriteObject और readObject विधियों के उपयोग के माध्यम से अपने स्वयं के क्रमिकरण का ख्याल रखता है।

4

हैशमैप्स क्रमिकरण के दौरान अपनी प्रविष्टि वस्तुओं को क्रमबद्ध नहीं करते हैं। इसकी writeObject विधि पर एक नज़र डालें।

javadocs व्याख्या करते हैं:

HashMap (बाल्टी सरणी की लंबाई) की क्षमता उत्सर्जित (पूर्णांक), आकार (एक पूर्णांक, की-वैल्यू मैपिंग की संख्या से पीछा किया है), प्रत्येक कुंजी-मूल्य मैपिंग के लिए कुंजी (ऑब्जेक्ट) और मान (ऑब्जेक्ट) के बाद। कुंजी-मूल्य मैपिंग किसी विशेष ऑर्डर में उत्सर्जित नहीं होते हैं।

यदि आप readObject विधि देखते हैं तो आप देखेंगे कि कैसे प्रविष्टि तालिका आकार, कुंजी और मानों का उपयोग करके पुनर्निर्मित की जाती है।

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