HashMap怎么实现序列化的

Java 0 1197 0 2021-05-14 23:49:08

HashMap怎么实现序列化的

HashMap的源代码:HashMap实现了Serializable接口(这个接口就是使得对象实例可以被保存成文件,在后续使用的时候可以直接从文件中把这个对象实例给读出来,对象中的数据还在),发现

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

table是HashMap用来存储数据的数组,table变量前面加上了transient关键字,这个关键字的意思是在序列化的时候不用管这个变量。 HashMap实现序列化不就是为了可以把table中的数据写到文件里面吗?为什么又要加上这个关键字? 看HashMap中的一些和table有关的方法,发现 writeObject(ObjectOutputStream)readObject(ObjectInputStream) 这两个方法,在实现序列化的时候,如果该类实现了 writeObjectreadObject 这两个方法那么就会调用该类的实现,如果没有的话就会使用 defaultWriteObject()defaultReadObject(),而HashMap就是自己实现了 writeObjectreadObject 方法,自己对table做了处理。

为什么HashMap要自己对table做处理呢

大家都知道HashMap存储是根据Key的hash值来计算出,键值对应该放在数组的哪个位置,但是在不同的JVM中,得到的hash值不一定相同,意思就是在windows下的虚拟机将key=‘1’计算出来的hash值可能是存在table的第0个位置的,但是在linux环境下的虚拟机计算出来的key=‘1’的hash值可能是放在table的第1个位置,当我们去读table中的值的时候未必能拿到key='1’的值。

HashMap如何做的处理

在反序列化的时候,readObject中调用了一个叫做putForCreate的方法,这个方法中又调用了indexFor这个方法重新计算了key的hash值,这样就可以把key和value可以正确放到数组中。

原文:https://blog.csdn.net/qq_27347991/article/details/54195261

主题切换

颜色:

主题: