ArrayList 与 Vector 比较
![ArrayList与Vector比较](https://static001.geekbang.org/infoq/70/708808ea86a9f76bcf91cdb21885f42e.jpeg)
![](https://static001.geekbang.org/infoq/81/81bb81e976d85333a3322166c2d995c4.png)
这张图里的内容对我们学习 Java 来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要读一次源码。绿色部分内容已经很少用了,但在面试题中有可能会问到,我们来看一个经常出现的面试题:Arraylist 与 Vector 的区别是什么?
首先我们给出标准答案:1、Vector 是线程安全的,ArrayList 不是线程安全的。2、ArrayList 在底层数组不够用时在原来的基础上扩展 0.5 倍,Vector 是扩展 1 倍。
看上图 Vector 和 ArrayList 一样,都继承自 List,来看一下 Vector 的源码
![](https://static001.geekbang.org/infoq/4f/4f30f2e3bc45699c3467d49a93b04cc5.png)
实现了 List 接口,底层是数组实现
实现了 List 接口,底层和 ArrayList 一样,都是数组来实现的。分别看一下这两个类的 add 方法,首先来看 ArrayList 的 add 源码
![](https://static001.geekbang.org/infoq/a3/a31942cef50fcc7fca91d6c4da418c4e.png)
再看 Vector 的 add 源码
![](https://static001.geekbang.org/infoq/56/5632765e67a97d08fb7b981447222727.png)
方法实现都一样,就是加了一个 synchronized 的关键字,再来看看其它方法,先看 ArrayList 的 remove 方法
![](https://static001.geekbang.org/infoq/2b/2befaae0005abd0772c6d7f516164588.png)
再看 Vector 的 remove 方法
![](https://static001.geekbang.org/infoq/4d/4dc748641c7cfaef1e559d5b5e9b86cf.png)
方法实现上也一样,就是多了一个 synchronized 关键字,再看看 ArrayList 的 get 方法
![](https://static001.geekbang.org/infoq/c1/c10aeba9183d2611ef95176d4d6791c9.png)
Vector 的 get 方法
![](https://static001.geekbang.org/infoq/6f/6f4e139201689b07a3783205e299d0aa.png)
再看看 Vector 的其它方法
![](https://static001.geekbang.org/infoq/5c/5c584b4794b3de92aba122d080bd89de.png)
无一例外,只要是关键性的操作,方法前面都加了 synchronized 关键字,来保证线程的安全性。当执行 synchronized 修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector 效率要差很多。(多线程环境不允许用 ArrayList,需要做处理)。
至于底层数组的扩容区别,这里就不带着大家读源码了,有兴趣的朋友大家自己读吧,底层代码几乎是一样的,不同的只是计算后的新数组长度不一致。
和 ArrayList 和 Vector 一样,同样的类似关系的类还有 HashMap 和 HashTable,StringBuilder 和 StringBuffer,后者是前者线程安全版本的实现。希望以后大家在面试过程中,能说出个因为所以,而不是一味的去背面试题,唯有理解,无需再背。
版权声明: 本文为 InfoQ 作者【JavaEdge】的原创文章。
原文链接:【http://xie.infoq.cn/article/033953167e997a9f9e0f472d9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论