ArrayList、Vector和LinkedList有什么区别

ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态改变长度的数组

一、ArrayList和Vector的区别

存储结构

ArrayList和Vector是按照顺序将元素存储(从下表为0开始),删除元素时,删除操作完成后,需要使部分元素移位,默认的初始容量都是10.

ArrayList和Vector是基于数组实现的,LinkedList是基于双向链表实现的(含有头结点)。

扩容机制

从内部实现机制来讲,ArrayList和Vector都是使用Object的数组形式来存储的,所以索引数据的速度比较快,但是插入删除慢。

ArrayList和Vector都有一个初始化的容量大小,当向这两种类型中增加元素的时候,若容量不够,需要进行扩容。为了提高程序的效率,每次扩充容量,不是简单的扩充一个存储单元,而是一次增加多个存储单元。ArrayList扩容后的容量是之前的1.5倍,然后把之前的数据拷贝到新建的数组中去。而Vector默认情况下扩容后的容量是之前的2倍。

Vector可以设置容量增量,而ArrayList不可以。在Vector中,有capacityIncrement:当大小大于其容量时,容量自动增加的量。如果在创建Vector时,指定了capacityIncrement的大小,则Vector中动态数组容量需要增加时,如果容量的增量大于0,则增加的是大小是capacityIncrement,如果增量小于0,则增大为之前的2倍。

在这里需要说一下可变长度数组的原理:当元素个数超过数组的长度时,会产生一个新的数组,将原数组的数据复制到新数组,再将新的元素添加到新数组中。

线程安全

ArrayList与Vector最大的区别就是synchronization(同步)的使用,没有一个ArrayList的方法是同步的,而Vector的绝大多数办法都是直接或间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,其性能上也要略逊于ArrayList。

二、LinkedList

采用双向列表实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率较低,但是插入效率高。同时,LinkedList是非线程安全的容器

三、容器适用的情况

所以如果只是查找特定位置的元素或只在集合的末端增加移动元素,那么使用ArrayList或Vector都是一样的。

如果是在指定位置的插入、删除元素,最好选择LinkedList

当在多线程中使用容器时,选用Vector较为安全


 

猜你喜欢

转载自blog.csdn.net/qq_36470686/article/details/84677636
今日推荐