ArrayList、Vector的区别与联系

一.继承实现关系

都实现了:

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线程安全,但是我们完全可以自己实现同步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值