1.公共点
- 继承自相同的类,实现相同的接口
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- 底层数据结构都是数组Object[]
2.区别
- Vector的所有公有方法都是被关键字synchronized修饰的,线程安全。但是注意并不是所有的操作都是线程安全的。
对于复合方法(size方法 + remove方法),size和remove方法本身是线程安全的,但是复合方法deleteLast却不一定是同步的(参考文献点击打开链接)。原因是因为如果线程1在得到索引值lastIndex时,正准备执行remove操作时,线程2已经执行了remove操作,将该索引位置的元素删除了,那么线程1就会抛出越界异常。所以我们同样需要对该方法加同步锁以保证线程安全public Object deleteLast(Vector v){ int lastIndex = v.size()-1; v.remove(lastIndex); }
public void deleteLast() { synchronized (v) { int index = v.size() - 1; v.remove(index); } }