一、List集合类思维导图
List:存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
二、ArrayList、Vector、Stack及LinkedList区别简述
- ArrayList:继承自AbstractList,实现了List接口,非线程安全,动态数组
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- Vector:继承自AbstractList,实现了List接口,线程安全。数组
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- Stack:继承自Vector,线程安全,数组
public class Stack<E> extends Vector<E>
- LinkedList:继承自AbstractSequencetialList,实现了List及Deque接口,非线程安全,双向链表
public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
三、详解及示例说明
- ArrayList
ArrayList 底层是数组队列,相当于动态数组,对比Java数组来说,它通过ensureCapacity来动态扩容;
ArrayList实现了RandomAccess接口,表示实现这个接口的List集合是支持快速随机访问(通过元素序号快速获取元素对象);
ArrayList对比LinkedList在查询和修改上更高效,复杂度为o(1),插入和删除复杂度为o(n)。
ArrayList在单线程中已经基本取代了Vector。
ArrayList核心扩容源码
//扩容机制
/**
* @param minCapacity 所需的最小容量
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
//获取最小扩容量
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 比较默认最小扩容量和所需最小扩容量
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
//判断是否要扩容
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
//开始扩容
grow(minCapacity);