前言
刷过面试题都知道,对于ArrayList和Vector的差异我们往往都能道出一二,比如在扩容的时候,ArrayList扩大的是原来的1.5倍,而Vector是2倍,具体源码是怎么实现的,我们就从源码的角度来揭示吧。楼主也是抱着记录学习的心态来写文章的,希望有什么讲错了可以在评论区讨论,共勉。
成员变量及构造函数
ArrayList:
Vector:
从类的初始化代码可以看出,ArrayList和Vector的数据结构基本一致,初始化容量大小都是10,不同的是Vector的构造函数还可以传递扩容增量(即下次扩容时数组容量扩大的单元数量)
扩容
ArrayList:
Vector:
从源码中可以看出,ArrayList扩容时默认扩容为原来的1.5倍,且该数值无法自定义,而Vector则可以自定义扩容大小,不设置默认为原来的2倍,而对于数组的扩容,因为数组是无法动态变化其容量的,底层都是使用了深拷贝,即new一个新的数组并复制原数组过来,所以比较消耗性能。所以对于需要经常进行插入操作的数据,在使用ArrayList和Vector时一定要设置好初始容量。
同步问题
Vector:
在并发情况下,由于Vector在增删方法中都加入了synchronized关键字,而ArrayList是没有的,所以Vector在并发情况下是可以安全进行增删的,但是对应的效率会比较低。细心的同学会发现,在涉及到增删的方法中,都出现了modCount这个变量,这个变量到底有什么用,这个就是下篇文章要提到的,感兴趣的可以关注一下下篇文章。