一.继承实现关系
都实现了:
List<E>, RandomAccess, Cloneable, java.io.Serializable
都继承了:
AbstractList<E>
二.存储方式
ArrayList:底层存储的是数组
Vector:底层存储的是也是数组
三.序列化机制
我们可以看到,ArrayList中的底层存储数组是有一个 transient 修饰符的:
于是试一下ArrayList的序列化机制:
明显不对啊,为什么[zhangsan]还是被序列化出来了。那么这个transient的作用又是什么呢?
原因在于ArrayList类中的writeObject和readObject方法:
ArrayList在序列化的时候会调用writeObject,直接将size和element写入ObjectOutputStream;反序列化时调用readObject,从ObjectInputStream获取size和element,再恢复到elementData。
element间接地参与了序列化
为什么不直接用elementData来序列化,而采用上诉的方式来实现序列化呢?原因在于elementData是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而节省空间和时间。
四.默认初始长度
都是10.
五.扩容机制
ArrayList:
Vector:
capacityIncrement:原容量大小的倍数,比如(0.75),向量的大小大于其容量时,容量自动增加的量。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。如果容量的增量小于等于零,则每次需要增大容量时,向量的容量将增大一倍。
六.线程安全
Vector线程安全,但是我们完全可以自己实现同步