• HashMap如何实现序列化


    /**
         * 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 {
            int buckets = capacity();
            // Write out the threshold, loadfactor, and any hidden stuff
            s.defaultWriteObject();
            s.writeInt(buckets);
            s.writeInt(size);
            internalWriteEntries(s);
        }
    
        /**
         * Reconstitute the {@code HashMap} instance from a stream (i.e.,
         * deserialize it).
         */
        private void readObject(java.io.ObjectInputStream s)
            throws IOException, ClassNotFoundException {
            // Read in the threshold (ignored), loadfactor, and any hidden stuff
            s.defaultReadObject();
            reinitialize();
            if (loadFactor <= 0 || Float.isNaN(loadFactor))
                throw new InvalidObjectException("Illegal load factor: " +
                                                 loadFactor);
            s.readInt();                // Read and ignore number of buckets
            int mappings = s.readInt(); // Read number of mappings (size)
            if (mappings < 0)
                throw new InvalidObjectException("Illegal mappings count: " +
                                                 mappings);
            else if (mappings > 0) { // (if zero, use defaults)
                // Size the table using given load factor only if within
                // range of 0.25...4.0
                float lf = Math.min(Math.max(0.25f, loadFactor), 4.0f);
                float fc = (float)mappings / lf + 1.0f;
                int cap = ((fc < DEFAULT_INITIAL_CAPACITY) ?
                           DEFAULT_INITIAL_CAPACITY :
                           (fc >= MAXIMUM_CAPACITY) ?
                           MAXIMUM_CAPACITY :
                           tableSizeFor((int)fc));
                float ft = (float)cap * lf;
                threshold = ((cap < MAXIMUM_CAPACITY && ft < MAXIMUM_CAPACITY) ?
                             (int)ft : Integer.MAX_VALUE);
                @SuppressWarnings({"rawtypes","unchecked"})
                    Node<K,V>[] tab = (Node<K,V>[])new Node[cap];
                table = tab;
    
                // Read the keys and values, and put the mappings in the HashMap
                for (int i = 0; i < mappings; i++) {
                    @SuppressWarnings("unchecked")
                        K key = (K) s.readObject();
                    @SuppressWarnings("unchecked")
                        V value = (V) s.readObject();
                    putVal(hash(key), key, value, false, false);
                }
            }
        }

     HashMap实现了Serizeble接口,说明能够被序列化 ,但是发现HashMap的成员变量  transient Node<K,V>[] table;transient Set<Map.Entry<K,V>> entrySet;transient int size;transient int modCount;。。。

      都被transient修饰了,代表在序列化的时候忽略这些字段。

    后面才发现HashMap实现了writeObject和readObject这两个方法那么序列化时就会调用该类的实现,如果没有的话就会使用defaultWriteObject()和defaultReadObject(),而HashMap就是自己实现了writeObject和readObject方法,自己对table做了处理。

    必须注意地是,writeObject()与readObject()都是private方法,那么它们是如何被调用的呢?毫无疑问,是使用反射。详情可见ObjectOutputStream中的writeSerialData方法,以及ObjectInputStream中的readSerialData方法。

  • 相关阅读:
    NHibernate初学遇到的问题及解决方案之一
    MSSQL2005数据库备份时提示:System.Data.SqlClient.SqlError: 媒体集有 2 个媒体簇,但只提供了 1 个。 .
    VS自带的ASP.NET web服务器Cassini源代码
    Python开发WebService使用soaplib库
    vue入门创建项目
    vue回顾Object.defineproperty方法
    虚拟机ping不通百度的解决方案
    zookeeper完全分布式环境部署
    vue+echarts生成图表步骤
    虚拟机时间同步
  • 原文地址:https://www.cnblogs.com/swave/p/10831002.html
Copyright © 2020-2023  润新知