List接口
public interface List<E> extends Collection<E>
List是Collection接口的子接口,也是最常用的接口。此接口对Collection接口进行了大量的扩充,里面的内容是允许重复允许为NULL的并且有序(插入顺序)。
List接口的实现类:ArrayList、LinkedList、Vector、Stack
1.ArrayList
底层实现:数组
ArrayList的继承关系:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承了AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Serializable这些接口。
ArrayList实现了List接口:存放单值,里面的内容是允许重复允许为NULL的并且有序(插入的顺序)。
ArrayList实现了RandomAccess接口:这个是一个标记性接口,表示ArrayList支持快速随机访问。在ArrayList中,我们可以通过元素的序号快速获取元素对象,这就是快速随机访问。
ArrayList实现了Cloneable接口:集合可以使用Object.Clone()方法。
ArrayList实现了java.io.Serializable接口:可序列化,表示ArrayList可以进行序列化操作。
ArrayList使用场景:
(1)适合做随机访问操作,不适合做随机的插入或者删除操作。
原因:ArrayList的底层是数组,随机访问可以根据下标快速获取数据。随机插入删除时,ArrayList会伴随大量的数据移动工作,是非常耗时的。
(2)ArrayList中的操作是线程不安全的。建议在单线程中才使用ArrayList。
ArrayList主要方法:
1.添加:
boolean add(E e) :将指定的元素追加到此列表的末尾。
void add(int index, E element):在此列表中的指定位置插入指定的元素。
boolean addAll(Collection<? extends E> c):按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
boolean addAll(int index, Collection<? extends E> c):将指定集合中的所有元素插入到此列表中,从指定的位置开始。
2.删除:
E remove(int index):删除该列表中指定位置的元素。
boolean remove(Object o):移除指定元素。
void clear():清空ArrayList内的所有元素,不减小数组容量。
void removeRange(int fromIndex, int toIndex):从此列表中删除所有索引为fromIndex (含)和toIndex之间的元素。
boolean removeAll(Collection<?> c):从此列表中删除指定集合中包含的所有元素。
boolean retainAll(Collection<?> c):仅保留此列表中包含在指定集合中的元素。
3.修改:
E set(int index, E element):用指定的元素替换此列表中指定位置的元素。
4.查询:
E get(int index):返回此列表中指定位置的元素。
5.其他方法:
void trimToSize():修改这个ArrayList实例的容量是列表的当前大小。
void grow(int minCapacity):扩容。
int size():返回此列表中的元素个数。
boolean isEmpty():判断ArrayList是否为空。
boolean contains(Object o):判断元素是否存在于列表中。
2.LinkedList
底层实现:双向链表
LinkedList的继承关系:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
LinkedList继承了AbstractSequentialList,实现了 List, Deque, Cloneable, java.io.Serializable这些接口。
LinkedList是一个继承于AbstractSequentialList的双向链表。它也可以被当做堆栈、队列或双端队列进行使用。
LinkedList实现了List接口:能让它进行队列操作。
LinkedList实现了Deque接口:能将LinkedList当做双端队列使用。
LinkedList实现了Cloneable接口:集合可以使用Object.Clone()方法。
LinkedList实现了java.io.Serializable接口:可序列化,表示LinkedList可以进行序列化操作。
LinkedList使用场景:
(1)适合做插入删除操作,不适合做随机访问操作。
原因:LinkedList底层是双向链表,增删操作就是在对应位置断开链表,然后在对应链表设置新元素的前后节点即可。随机访问时,LinkedList需要一个一个的遍历查询,查询效率很低。
(2)LinkedList中的操作是线程不安全的。
LinkedList主要方法:
1.添加:
void addFirst(E e):在链表头部添加元素
void addLast(E e):在链表尾部添加元素
boolean add(E e):将元素添加到链表尾部
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):将集合插入到链表尾部
boolean addAll(int index, Collection<? extends E> c):将集合从指定位置开始插入
2.删除:
E removeFirst():删除头节点
E removeLast():删除尾节点
E unlinkLast(Node<E> l):删除指定节点
boolean remove(Object o):删除指定元素
E remove():删除头节点
E remove(int index):删除指定位置的元素
3.修改:
E set(int index, E element):修改指定位置节点的元素值
4.查询:
E getFirst():获取链表头节点的元素值
E getLast():获取链表尾节点的元素值
E get(int index):获取指定位置的元素值
3.Vector
底层实现:数组
Vector的继承关系:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Vector继承了AbstractList,实现了List、RandomAccess、Cloneable、 java.io.Serializable等接口。
Vector实现了List接口:能够进行队列操作。
Vector实现RandomAccess接口:能够快速随机访问(即通过索引值就能访问得到)。
Vector实现了Cloneable接口:集合可以使用Object.Clone()方法。
Vector使用场景:
Vector和ArrayList特点几乎是一样的。
与ArrayList不同的是,Vector中的操作是线程安全的。
Vector主要方法:
1.添加:
synchronized boolean add(E e):在数组尾部添加一个元素
void add(int index, E element):在数组指定位置index处添加元素
synchronized boolean addAll(Collection<? extends E> c):
synchronized boolean addAll(int index, Collection<? extends E> c):
2.删除:
boolean remove(Object o):删除指定元素
synchronized E remove(int index):删除指定位置元素
synchronized void removeElementAt(int index):删除index位置的元素
synchronized boolean removeElement(Object obj):在Vector中查找并删除元素
synchronized void removeAllElements():删除Vector中的全部元素
void clear():清空Vector
synchronized boolean removeAll(Collection<?> c):删除指定集合中包含的所有元素
synchronized boolean retainAll(Collection<?> c):保留包含在指定集合中的元素
synchronized void removeRange(int fromIndex, int toIndex):删除fromIndex到toIndex的元素
3.修改:
synchronized void setElementAt(E obj, int index):修改index位置的元素值
synchronized E set(int index, E element):修改index位置的值
4.查询:
synchronized E get(int index):获取index位置的元素
4.Stack
public class Stack<E> extends Vector<E>
底层实现:Stack继承自Vector,底层是通过数组实现的。
特性是:先进后出。Stack操作是线程安全的。
Stack主要方法:
E push(E item):将元素存入栈顶
synchronized E pop():返回栈顶元素,并将其从栈中删除
synchronized E peek():返回栈顶元素,不执行删除操作
boolean empty():判断栈是否为空
synchronized int search(Object o):查找“元素o”在栈中的位置:由栈底向栈顶方向数