vector和arraylist

来源:互联网 发布:kol粉丝数据分析 编辑:程序博客网 时间:2024/06/04 09:49

最近在翻java编程思想,看到了书上的一段话在吐槽Vector和HashTable:

1.vector作为java1.0和1.1中广泛运用的基础类所有方法被设计为final,使使用者无法继承该类开发出其他有用的类,然而自身设计Stack类时却继承了Vector

2.然而HashTable同样作为一个重要的1.0和1.1的标准类库却明显不包含任何final方法


Vector和ArrayList:

Vector和ArrayList都是通过数组实现,并且都继承了AbstractList,实现了List接口,最大的不同在于Vector是线程同步的,查看Vector的源代码可以看到几乎所有的类都用关键字synchronized修饰,而ArrayList是非线程同步的。

1.Vector和ArrayList内部的方法几乎一样,查看源码的构造函数有四种,但无论通过哪种方式初始化都需要指定vector的初始容量(直接指定、默认为10、通过Collection的size()),并且Vector的扩容策略是:如果指定了capacityIncrement且<=0,则每次容量增大为原来的两倍,否则增大的容量为指定的capacityIncrement。

2.ArrayList非同步,在不要求同步的场景下性能优于Vector,ArrayList的扩容策略为每次增加之前容量的1/2

线程同步会有大量开销影响性能,所以Vector性能不如ArrayList。同时由于底层实现二者都是基于数组,所以随机访问速度较好,而增删操作性能一般(相较于LinkedList,这是因为增删操作需要对数据进行一系列操作,代价较大,查看源码可看到对于插入和删除操作,都需要复制数据到新的存储空间中(使用System.arraycopy)。


ps:LinkedList在随机访问其中的元素时需要遍历整个List来达到目的,速度较慢,但是由于其数据结构是链表结构存储,适合数据的动态插入和删除。