Arraylist与Vector的区别是什么?
- Vector是线程安全的,ArrayList不是线程安全的。
- ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。
Vector和ArrayList一样,都继承自List,来看一下Vector的源码:
1 | public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable { |
实现了List接口,底层和ArrayList一样,都是数组来实现的。分别看一下这两个类的add方法,首先来看ArrayList的add源码:
1 | public boolean add(E e) { |
再看Vector的add源码:
1 | public synchronized boolean add(E e) { |
方法实现都一样,就是加了一个synchronized的关键字,再来看看其它方法,先看ArrayList的remove方法:
1 | public E remove(int index) { |
再看Vector的remove方法:
1 | public synchronized E remove(int index) { |
方法实现上也一样,就是多了一个synchronized关键字,再看看ArrayList的get方法:
1 | public E get(int index) { |
Vector的get方法:
1 | public synchronized E get(int index) { |
再看看Vector的其它方法:
1 | public synchronized int capacity() { |
无一例外,只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性。当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用ArrayList,需要做处理)。
和ArrayList和Vector一样,同样的类似关系的类还有HashMap和HashTable、StringBuilder和StringBuffer、后者是前者线程安全版本的实现。
参考资料:
清浅池塘 Arraylist与Vector的区别