ArrayList、Vector 和 LinkedList 有什么区别

ArrayList、Vecotr、LinkedList 类均为 java.util 包中,均为可伸缩数据,既可以动态改变长度的数组。都是 list 接口的实现类;

【1】ArrayList 和 Vector都是基于存储的 Object[] array 来实现的,它们会在内存中开辟一块连续的空间来存储(默认是10数组大小的内存),由于数据存储是连续的,因此,它们支持用序号(下标)来访问元素,同时索引数据的速度比较快。但是在插入/删除元素时需要移动容器中的元素,所以对数据的插入/删除操作执行比较慢。ArrayList 和 Vector都是一个初始化的容量的大小,当存储的元素超过分配内存大小时就需要动态地扩展它们的存储空间(会重新创建一个新的数组,将旧的数据复制过去)。为了提高效率,每次扩充容量时,不是简单的扩充一个存储单位,而是一次增加多个存储单元,Vector 默认扩充为原来的2倍(每次扩充的大小是可以设置的),而 ArrayList 默认扩充1.5倍(没有提供方法来设置空间扩充大小)。
【2】ArrayList 与 Vector最大的区别就是 synchronization(同步)的使用,没有一个 ArrayList的方法是同步,而 Vector的绝大数方法(add、insert、remove、set、equals、hashcode等)都是直接或者间接同步的,所以 Vector是线程安全的,ArrayList 不是线程安全的。正是由于 Vector是线程安全的,所以性能上也略逊于 ArrayList。
【3】LinkedList 是采用双向链表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率高。同时 LinkedList是非线程安全的容器。
【4】那么,在实际使用时,当对数据主要操作为索引或只是集合的未端增加、删除元素时,使用 ArralyList或 Vector效率比较高;当对数据的操作主要是指位置的插入或者删除操作时,使用 LinkedList效率比较高;当在线程中使用容器时(既多线程同时访问该容器),选用 Vector较为安全。

发布了95 篇原创文章 · 获赞 2 · 访问量 3546

猜你喜欢

转载自blog.csdn.net/m0_37235955/article/details/105388613
今日推荐