标签 - 源码阅读

源码阅读 HashMap    2016-04-30 23:17:48    580    0    0

现象

如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。
private void writeObject(java.io.ObjectOutputStream s) throws IOException
private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException
这两个方法有两个共同点:
1. 都是私有方法
2. 虽然是私有方法,但是在HashMap内部却找不到任何调用它们的地方

疑问

  1. 这两个方法是干嘛用的?
  2. 为什么要设置成私有的?、

解答

1. HashMap中的writeObject和readObject方法的作用是什么?

答:readObject和writeObject方法都是为了HashMap的序列化而创建的。
首先,HashMap实现了Serializable接口,这意味着该类可以被序列化,而JDK提供的对于Java对象序列化操作的类是ObjectOutputStream,反序列化的类是ObjectInputStream。我们来看下序列化使用的ObjectOutputStream,它提供了不同的方法用来序列化不同类型的对象,比如writeBoolean,wrietInt,writeLong等,对于自定义类型,提供了writeObject方法。
ObjectOutputStream的writeObject方法会调用下面的方法:

  1. private void writeSerialData(Object obj, ObjectStreamClass desc)
  2. throws IOException
  3. {
  4. ObjectStreamClass.ClassDataSlot[] slots = desc.getClassDataLayout();
  5. for (int i = 0; i < slots.length; i++) {
  6. ObjectStreamClass slotDesc = slot