ArrayList源码解读---transient关键字与序列化

今天带大家来看一下ArrayList源码

public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable

我们可以看到ArrayList继承了AbstractList这个抽象类,同时也继承了List, RandomAccess, Cloneable, java.io.Serializable这四个接口!

Cloneable:实现深拷贝和浅拷贝

RandomAccess:实现随机访问

java.io.Serializable:实现序列化和反序列化

在解读ArrayList之前,关于接口和抽象类有些性质是必须要了解的

抽象类中未实现的方法它的子类必须要重写实现,如果子类不是抽象类!

transient Object[] elementData;

可能有人看不明白这段代码,主要在于transient关键字,它是用来干嘛的呢?

ArrayList实现了java.io.Serializable接口,如果不需要序列化的对象就用transient来修饰,它的作用就是把这个字段修饰的对象生命周期仅存于调用者的内存中而不会写到磁盘里持久化,所谓的序列化就是把对象转变为可读的字节码文件,字节码文件才能被字节码执行引擎执行,最终存在JVM中

为什么ArrayList要加transient关键字?

其实是因为elementData数组中不是所有的元素都有数据,因为容量的问题,elementData有些容量是空的,是没有必要序列化的,ArrayList采用writeObject和readObject方法来实现序列化和反序列化!

你可能感兴趣的:(java,arraylist,transient)