1、Vector是线程安全的,ArrayList不是线程安全的。
2、ArrayList在底层数组不够用时在原来的基础上扩展0.5倍,Vector是扩展1倍。



只要是关键性的操作,方法前面都加了synchronized关键字,来保证线程的安全性
加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。
和ArrayList和Vector一样,同样的类似关系的类还有HashMap和HashTable,StringBuilder和StringBuffer,后者是前者线程安全版本的实现。

add: synchronized

  1. public synchronized boolean add(E e) {
  2. modCount++;
  3. ensureCapacityHelper(elementCount + 1);
  4. elementData[elementCount++] = e;
  5. return true;
  6. }

contains: synchronized

  1. public boolean contains(Object o) {
  2. return indexOf(o, 0) >= 0;
  3. }
  4. public synchronized int indexOf(Object o, int index) {
  5. if (o == null) {
  6. for (int i = index ; i < elementCount ; i++)
  7. if (elementData[i]==null)
  8. return i;
  9. } else {
  10. for (int i = index ; i < elementCount ; i++)
  11. if (o.equals(elementData[i]))
  12. return i;
  13. }
  14. return -1;
  15. }

线程不安全的操作:put-if-absent

  1. if (!vector.contains(element))
  2. vector.add(element);
  3. ...
  4. }
  1. 线程A判断完vector.contains(element)表明没有element元素,进入if内部;
  2. 此时线程B抢占处理器,执行vector.contains(element)<br />
  3. 线程A重新执行,add操作线程不安全了

单个方法具有原子性,但是contains+add的复合操作是没有的.