List 接口
源码中的描述:An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.
有序集合,通过此接口可以精准地插入元素。可以通过整数索引查找元素。
特有的函数
//排序,根据实现Comparator接口 | |
default void sort(Comparator<? super E> c) { | |
Object[] a = this.toArray(); | |
Arrays.sort(a, (Comparator) c); | |
ListIterator<E> i = this.listIterator(); | |
for (Object e : a) { | |
i.next(); | |
i.set((E) e); | |
} | |
} | |
//根据索引获取元素 | |
E get(int index); | |
//替换原来的元素,返回值是原来的值 | |
E set(int index, E element); | |
//插入 | |
void add(int index, E element); | |
//删除 | |
E remove(int index); | |
//返回某元素的索引值 | |
int indexOf(Object o); | |
int lastIndexOf(Object o); | |
//从索引开始的迭代器 | |
ListIterator<E> listIterator(int index); | |
//返回此列表中指定的fromIndex (包含) 和toIndex (包含) 之间的部分视图。(如果fromIndex和toIndex相等,则返回的列表为空。)即[from,to) | |
List<E> subList(int fromIndex, int toIndex); | |
List中常用的实现类
一、ArrayList
底层数据结构是数组,查询快,增删慢,线程不安全,效率高
//存储元素 | |
transient Object[] elementData; | |
...没了.. |
最常用吧。
二、LinkedList
底层数据结构是链表,查询慢,增删快,线程不安全,效率高
//节点:双向链表 | |
private static class Node<E> { | |
E item; | |
Node<E> next; | |
Node<E> prev; | |
Node(Node<E> prev, E element, Node<E> next) { | |
this.item = element; | |
this.next = next; | |
this.prev = prev; | |
} | |
} | |
//头结点 | |
transient Node<E> first; | |
//尾节点 | |
transient Node<E> last; | |
public E getFirst(); | |
public E getLast() ; | |
public E removeFirst() ; | |
public E removeLast(); | |
public void addFirst(E e) | |
public void addLast(E e) { | |
linkLast(e); | |
public boolean contains(Object o); |
对于头尾操作频繁的化LinkedList更合适
删除也更加快,但查询需要遍历链表,所以更慢
三、Vector
底层数据结构是数组,这就是常说的向量,查询快,增删慢,线程安全,效率低
//底层是数组 | |
protected Object[] elementData; | |
//函数都是synchronized修饰的,所以线程安全,查询也快,但是比ArratList慢 | |
public Enumeration<E> elements();//相当于迭代器 | |
public synchronized E elementAt(int index);//get函数 | |
public synchronized void setElementAt(E obj, int index)//set | |
public synchronized void removeElementAt(int index) | |
public synchronized void insertElementAt(E obj, int index) //add | |
public synchronized void addElement(E obj); | |
特点是线程安全吧
总结
List中元素有放入顺序,元素可重复,
ArrayList是实现了基于动态数组的数据结构,地址是连续的,所以查询速度快,但是删除和插入元素效率较低。最常用的。
LinkedList基于链表的数据结构,地址是任意的,节点空间都是散列的,对于删除和插入操作,LinedList效率较高。LinkedList 适用于要头尾操作或插入指定位置的场景。但是查询的话需要移动指针,遍历,效率较慢
Vector和ArrayList一样,是实现了基于动态数组的数据结构,但是是线程同步的,效率很低。当然,需要线程安全的话还是要使用Vector