从底层了解ArrayList和Vector的区别

ArrayList和Vector这二者都是封装了一个可变化,可扩容的动态数组,而Vector 只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性,其他2者都是差不多的。

Vector的历史

由于Vector是从jdk1.0开始就有了,那时候还没有集合框架,所以Vector里有些方法名是很长的,如addElenment(Object o),而ArrayList是从Jdk1.2系统提供框架后出现的,所以是add(),其实者2个方法是一样的。所以JDK1.2后,就将Vector改为实现了List接口,因为为了简写编程,所以改写了哪些方法名很长的方法,从而导致了Vector有一些方法是重复功能的。如:

 
  1. //原有的方法
  2. public synchronized void addElement(E obj) {
  3. modCount++;
  4. ensureCapacityHelper(elementCount + 1);
  5. elementData[elementCount++] = obj;
  6. }
  7. //List接口的短名字方法
  8. public synchronized boolean add(E e) {
  9. modCount++;
  10. ensureCapacityHelper(elementCount + 1);
  11. elementData[elementCount++] = e;
  12. return true;
  13. }

二者区别

1.由于Vector是线程安全的,所以Vector的性能比较低,最好不要用,如果要保证线程的安全,也可以 用Collections工具类,也可以将ArrayList变成线程安全的

 
  1. //Vector的add
  2. public synchronized boolean add(E e) {
  3. modCount++;
  4. ensureCapacityHelper(elementCount + 1);
  5. elementData[elementCount++] = e;
  6. return true;
  7. }
  8. //ArrayList的add
  9. public boolean add(E e) {
  10. modCount++;
  11. ensureCapacityHelper(elementCount + 1);
  12. elementData[elementCount++] = e;
  13. return true;
  14. }

所以Vector的实现逻辑是跟ArrayList是一样的,主要是多了synchronized关键字,当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。你可以先了解ArrayList的源码—》》》》》从源码深入底层解析Java的数组列表ArrayList看完这篇文章后就知道了。