从源码看ArrayList与Vector

前言

刷过面试题都知道,对于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这个变量,这个变量到底有什么用,这个就是下篇文章要提到的,感兴趣的可以关注一下下篇文章。

猜你喜欢

转载自juejin.im/post/5e707aba6fb9a07cac1d7a1a