什么是List
初识
list字面翻译是列表、清单的意思。List是一种有序的容器,通过线性方式管理数据,它的内部结构是双向链表;
在jdk中是属于集合类工具,继承了collection接口。
简单看一下List接口的方法
相知
List只是一个接口类,它只是定义List领域的一些基本方法,具体的实现还是子类去实现的,比如经常用的arraylist就是其中一个实现类。
list的接口实现类:AbstractList、ArrayList、LinkedList、Vector,其中AbstractList是抽象类。
分别介绍一下ArrayList、LinkedList、Vector
一、ArrayList
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
1、ArrayList继承了抽象类AbstractList
2、实现List接口,实现了list基本功能
3、实现了RandomAccess,这个一个标记接口,没有方法实现;获得了快速随机访问存储元素的功能,LinkedList没有实现这个接口
4、实现了Cloneable,表示该对象可以克隆,重写了clone方法
5、实现了Serializable,表示可以被序列化,可以被传输
特点:
(1)因为是数组,随机访问速度快,可以为null,有序
(2)增、删慢、需要移动元素
(3)容量不固定,随着容量增大动态扩容
int newCapacity = oldCapacity + (oldCapacity >> 1);
(3)线程不安全
二、LinkedList
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
1、继承了抽象类AbstractSequentialList,是一个双向链表
从上可以看到该抽象类实现了get(int)、set(int,E)、add(int,E)等多个骨干函数,这些函数都是随机访问List的。
2、实现了List接口基本方法
3、实现了Deque,可以当作双端队列使用
4、实现了Cloneable,对象可以克隆
5、实现了Serializable序列化
特点:
1、相对ArrayList,LinkedList是双向链表,随机访问效率低
2、LinkedList是双向链表,移动不需要移动底层元素,只需要修改链表指针节点,对元素的插入,删除效率高
三、Vector
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
1、继承了抽象类AbstractList
2、实现了List接口的基本功能
3、实现了RandomAccess接口,快速随机访问的特点
4、实现了Cloneable,可克隆
5、实现Serializable系列化接口,可传输
特点:
1、可重复、有序
2、可扩容
3、线程安全,方法都是synchronized修饰
List使用场景
如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
(1)对于需要快速插入,删除元素,应该使用LinkedList。
(2)对于需要快速随机访问元素,应该使用ArrayList。
(3)对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
(4)对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。