List集合
An ordered collection – 有序集合
//List 的类信息
public interface List<E> extends Collection<E>
//Collection 的类信息--定义基本的method
public interface Collection<E> extends Iterable<E>
//Iterable 的类信息---值得一说,jdk1.8+foreach就是此处
public interface Iterable<T>
关注的实现类
- ArrayList
- LinkedList
- Vector
ArrayList
特点: 遍历速度快,底层原理数组,非线程安全
源码解析:
//无参构造
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// elementData 是一个对象数组
transient Object[] elementData;
//DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是一个常量空对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// CRUD---add方法
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
...
//底层原理--还是数组的copy
Arrays.copyOf(elementData, newCapacity);
由此可见,ArrayList 底层数据结构是数组,crud是数组的copy,非线程安全,但是有数组的特性,遍历速度快
LinkedList
特点: 更新速度快,底层原理链表,非线程安全
源码解析:
//无参构造
public LinkedList() {
}
// 关键成员变量
//数组长度
transient int size = 0;
//链表第一个元素
transient Node<E> first;
//链表最后一个元素
transient Node<E> last;
//crud方法--add
public boolean add(E e) {
linkLast(e);
return true;
}
...
//原理--改变上一个元素和下一个元素,然后修改长度
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
由此可见,ArrayList 底层数据结构是链表,crud是改变链表的上下指向,所以更新效率高于数组,同时也是非线程安全
Vector
特点: 遍历速度快,底层原理数组,线程安全
源码解析:
//无参构造
public Vector() {
this(10);
}
// this(10);干了什么
this.elementData = new Object[10];
this.capacityIncrement = 10;
//elementData 是一个对象数组
protected Object[] elementData;
//capacityIncrement 是长度变量
protected int elementCount;
//crud方法--add synchronized 修饰线程安全
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
...
//原理--数组的copy
elementData = Arrays.copyOf(elementData, newCapacity);
由此可见,Vector底层数据结构是数组,crud是数组的copy,同时由synchronized 修饰是线程安全的,但是效率不如ArrayList
总结
ArrayList 和 Vector 底层都是数组,不同的是Vector 是线程安全的,缺点都是更新慢
LinkedList 底层是链表,非线程安全,优点是更新快,缺点遍历慢