ArrayList and Vector

来源:互联网 发布:船舶数据库 编辑:程序博客网 时间:2024/05/22 16:20

ArrayListVector

List集合的实现类中,主要有3个实现类:ArrayList,VectorLinkedList.其中Vector还有一个Stack子类,这个Stack子类仅在Vector父类的基础上增加了5个方法,这5个方法将一个Vector扩展成了Stack。本质上,Stack依然是一个Vector

Stack是一个线程安全的类,这也是为了让StackVector保持一致-Vector也是一个线程安全的类。实际上即使当程序中需要栈这种数据结构时,Java也不再推荐使用Stack类,而是推荐使用Deque实现类。从JDK1.6开始,Java提供了一个Dequq接口,并为该接口提供一个ArrayDeque实现类。在无需保证线程安全的情况下,程序完全可以使用ArrayDueue来代替Stack类。

Deque接口代表双端队列这种数据结构。双端队列已经不再是简单的队列了,它既是具有对立的性质先进先出(FIFO),也具有栈的性质(FILO),也就是双端队列既是队列,也是栈。

就像List集合拥有ArrayList实现类一样,Deque集合则拥有ArrayDueue实现类。ArrayListArrayDueue底层都是基于Java数组实现的,只是它们提供的方法不同而已。

VectorArrayList这两个集合类的本质并没有太大的不同,它们都实现了List接口,而且底层都是基于Java数组来存储集合元素。ArrayList使用transient修饰了elementData数组。这保证系统序列化ArrayList对象时不会直接序列化elementData数组,而是通过ArrayList提供的writeObject,readObject方法来实现定制序列化;但对于vector而言,它没有使用transient修饰的elementData数组,而是Vector只提供了一个writeObject方法,并未完全实现定制序列化。

从序列化机制的角度来看,ArrayList的实现比Vector的实现更安全。

除此之外,Vector其实就是ArrayList的线程安全版本,两者绝大部分方法的实现都是相同的,只是Vector的方法增加了snychronized修饰。

即使需要在多线程的环境下使用List集合,而且需要保证List集合的线程安全,依然可以避免使用Vector,而是考虑将ArrayList包装成线程安全的集合类,Java提供了一个Collections工具类,通过该工具类synchronizedList方法即可将一个普通的ArrayList包装成线程安全的ArrayList.

原创粉丝点击