ArrayList数组为什么要用transient修饰?
序列化
我们知道对象是不能直接进行网络传输的,必须要转化为二进制字节流进行传输。序列化就是将对象转化为字节流的过程。同理,反序列化就是从字节流构建对象的过程。
- 对于 Java 对象来说,如果使用 JDK 的序列化实现。对象只需要实现
java.io.Serializable
接口。 - 可以使用
ObjectOutputStream()
和ObjectInputStream()
对对象进行手动序列化和反序列化。 - 序列化的时候会调用
writeObject()
方法,把对象转换为字节流。 - 反序列化的时候会调用
readObject()
方法,把字节流转换为对象。 - Java 在反序列化的时候会校验字节流中的
serialVersionUID
与对象的serialVersionUID
时候一致。如果不一致就会抛出InvalidClassException
异常。官方强烈推荐为序列化的对象指定一个固定的serialVersionUID
。否则虚拟机会根据类的相关信息通过一个摘要算法生成,所以当我们改变类的参数的时候虚拟机生成的serialVersionUID
是会变化的。 transient
关键字修饰的变量 不会 被序列化为字节流
ArrayList
ArrayList底层是基于动态数组实现的,数组的长度是动态变化的,初始化长度为0,当添加一个元素的时候,数组的长度就会发生变