ArravList,LinkedList,Vector的特性
-
ArrayList:动态数组,使用的时候,只需要操作即可,内部已经实现扩容机制。
- 线程不安全
- 有顺序,会按照添加进去的顺序排好
- 基于数组实现,随机访问速度快,插入和删除较慢一点
- 可以插入
null
元素,且可以重复
-
Vector和前面说的
ArrayList
很是类似,这里说的也是1.8版本,它是一个队列,但是本质上底层也是数组实现的。同样继承AbstractList
,实现了List
,RandomAcess
,Cloneable
,java.io.Serializable
接口。具有以下特点:- 提供随机访问的功能:实现
RandomAcess
接口,这个接口主要是为List
提供快速访问的功能,也就是通过元素的索引,可以快速访问到。 - 可克隆:实现了
Cloneable
接口 - 是一个支持新增,删除,修改,查询,遍历等功能。
- 可序列化和反序列化
- 容量不够,可以触发自动扩容
- **最大的特点是:线程安全的*,相当于线程安全的
ArrayList
。
- 提供随机访问的功能:实现
-
LinkedList:链表结构,继承了
AbstractSequentialList
,实现了List
,Queue
,Cloneable
,Serializable
,既可以当成列表使用,也可以当成队列,堆栈使用。主要特点有:- 线程不安全,不同步,如果需要同步需要使用
List list = Collections.synchronizedList(new LinkedList());
- 实现
List
接口,可以对它进行队列操作 - 实现
Queue
接口,可以当成堆栈或者双向队列使用 - 实现Cloneable接口,可以被克隆,浅拷贝
- 实现
Serializable
,可以被序列化和反序列化
- 线程不安全,不同步,如果需要同步需要使用
ArravList,LinkedList,Vector的相同点与区别
Java提供了许多集合类来处理和操作数据,其中ArrayList、LinkedList和Vector是常见的几种。这些集合类具有相似的功能,但在实现和性能方面存在一些区别。本文将详细介绍ArrayList、LinkedList和Vector的相同点和区别,并提供相应的源代码示例。
相同点:
- 都实现了List接口:ArrayList、LinkedList和Vector都实现了Java的List接口,因此它们都支持有序的元素集合,并且允许元素重复。
- 支持动态添加和删除元素:这三个集合类都提供了添加、删除和修改元素的方法,可以根据需要动态地调整集合的大小。
- 支持迭代:所有这些集合类都可以使用迭代器(Iterator)来遍历集合中的元素。
- 可以存储任意类型的对象:ArrayList、LinkedList和Vector都可以存储任意类型的对象,包括基本类型的包装类。
区别:
- 底层实现方式:ArrayList和Vector底层都使用数组实现,而LinkedList使用双向链表实现。这导致它们在插入和删除元素时的性能表现有所不同。ArrayList和Vector在随机访问时性能较好,而LinkedList在插入和删除元素时性能更佳。
- 线程安全性:Vector是线程安全的,它的所有方法都经过同步处理,可以在多线程环境下使用。而ArrayList和LinkedList则不是线程安全的,如果在多线程环境下使用它们,需要自行处理线程同步问题。
- 扩容方式:当集合需要扩容时,ArrayList默认增加当前容量的一半,而Vector默认增加当前容量的一倍。这也是为什么在大量数据操作时,Vector的性能可能会比ArrayList略差的原因之一。
迭代器
LinkedList
源码中一共定义了三个迭代器:
Itr
:实现了Iterator
接口,是AbstractList.Itr
的优化版本。ListItr
:继承了Itr
,实现了ListIterator
,是AbstractList.ListItr
优化版本。ArrayListSpliterator
:继承于Spliterator
,Java 8 新增的迭代器,基于索引,二分的,懒加载器。
Vector
和ArrayList
基本差不多,都是定义了三个迭代器:
Itr
:实现接口Iterator
,有简单的功能:判断是否有下一个元素,获取下一个元素,删除,遍历剩下的元素ListItr
:继承Itr
,实现ListIterator
,在Itr
的基础上有了更加丰富的功能。VectorSpliterator
:可以分割的迭代器,主要是为了分割以适应并行处理。和ArrayList
里面的ArrayListSpliterator
类似。
LinkedList
里面定义了三种迭代器,都是以内部类的方式实现,分别是:
ListItr
:列表的经典迭代器DescendingIterator
:倒序迭代器LLSpliterator
:可分割迭代器