他们三个都是属于java.util包中的List接口,均为可以伸缩的数组可以动态改变长度
ArrayList和Vector
ArrayList和Vector都是基于Object[] array实现的,他们会在内存中开辟连续地址,由于地址连续他们支持用下标搜索数据,同时索引数据速度比较快,其中Vector每次扩容为当前大小的两倍(每次扩充大小可以变化),ArrayList默认扩充1 .5倍且不可设置变化。
ArrayList和Vector的区别就是ArrayList是线程不安全的,Vector是线程安全的,Vector中的方法都是同步方法(synchronized),所以ArrayList的执行效率要高于Vector,它也是用的最广泛的一种集合。
ArrayList和LinkedList
我们重点比较一下ArrayList和LinkedList的区别,其实ArrayList和LinkedList之间的区别就是数组和双向链表之间的区别。
ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于链表实现的非线程安全的集合。
对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。
新增和删除元素,一般LinkedList的速度要优于ArrayList。因为ArrayList在新增和删除元素时,可能扩容和复制数组;LinkedList实例化对象需要时间外,只需要修改指针即可。
LinkedList集合不支持 高效的随机随机访问(RandomAccess)
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
ArrayList | Vector | LinkedList | |
---|---|---|---|
底层实现方式 | Object数组 | Vector是基于synchronized实现的线程安全的ArrayList. Vector在扩容时会提高一倍,而ArrayList则是增加50% | 双向循环链表(JDK1.6之前) 双向链表(JDK1.7取消了循环) |
读写机制 | 插入:超过当前数组预定义的最大值时,数组需要扩容,扩容过程需要调用底层System.arraycopy()方法进行数组复制操作 删:删除元素时并不会减少数组的容量,如需缩小容量,可调用trimToSize()方法,在查找元素时要遍历数组,对非null的元素采取equals的方式查找 | 插入:须创建一个新的Entry对象,并更新相应元素的前后元素的引用 在查找元素时,需遍历链表 在删除元素时,要遍历链表,找到要删除的元素,然后从链表上将此元素删除 | |
读写效率 | ArrayList对元素的增加和删除都会引起数组的内存分配空间动态发生变化,对其进行插入和删除速度较慢,但检索速度快 | LinkedList由于基于链表方式存放数据,增加和删除元素的速度较快,但检索速度较慢 | |
线程安全性 | 非线程安全 | 非线程安全 |