ArrayList,Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态的改变长度的数组;
ArrayList和Vector都是基于存储元素的Object[ ] array 来实现的,他们会在内存中开辟一块连续的空间来存储,由于数据存储是连续的,因此,他们支持用序号(下标)来访问元素,同时索引数据的速度比较快。但是在插入元素时需要移动容器中的元素,所以对数据的插入操作执行的比较慢。ArrayList和Vector都有一个初始化的容量大小,当里边存储的元素超过这个大小时就需要动态地扩充他们的存储空间。为了提高程序的效率,每次扩充容量,不是简单的扩充一个存储单元,而是一次增加多个存储单元,Vector默认扩充为原来的两倍,(每次扩充空间的大小是可以设置的),而ArratList默认扩充为原来的1.5倍(没有提供方法来设置空间的填充方法)
ArrayList与Vector最大的区别是synchronized(同步)的使用,没有一个ArrayList的方法是同步的,而Vector大多数的方法是同步的,例如(add,insert,remove,set,equals,hashcode等,)都是直接或者间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的,正是由于Vector提供了线程安全的机制,其性能上也要略逊于ArryList
LinkedList 采用双向链表来实现,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率比较高,同时,LinkedList是非线程安全的容器。
那么,在实际使用时,如何从这几种容器中选择合适的使用呢?
当对数据的主要操作为索引或者只是在末尾添加,删除元素时,使用ArrayList或Vector效率比较高;当对数据的操作主要是指定位置的插入或删除时,使用LingkedList效率比较高;当在多线程中使用容器时(即多个线程同时访问该容器时),使用Vector比较安全。
常见笔试题:
-
若线性表最常用的操作是存取第i个元素及其前驱的值,则采用() 存储方式节省时间?
A. 单链表 B. 双链表 C. 单循环链表 D. 顺序表
答案: D 顺序适合在随机访问中的场合使用,访问的时间复杂度为O(1),而列表的随机操作的时间复杂度的为O(n); -
对于import java.util 包,下列说法错误的是()
A Vector类属于util 包 B. Vector放在…/java /util目录下
C. Vector类放在java.util文件下 D. Vector 类是SUN公司的产品
答案: C