介绍
1、元素有序(添加与取出顺序一致)、且可以重复
2、支持索引
ArrayList
介绍
1、可以加入一个或多个null
2、由数据实现数据存储
3、基本等同于Vector,但是ArrayList是县城不安全的(执行效率高),在多线程情况下,不建议使用ArrayList
add()方法源码
public boolean add(E e){
ensureCapacityInternal(size+1);
elementData[size++]=e;
return true;
}
ArrayList底层
1、ArrayList中维护了一个Object类型的数组elementData。
transient Object[] elementData;//transient 瞬间、短暂的。不会被序列化
2、创建AarrayList对象时,如果使用的是无参构造器,则初始elementData容量为0。第一次添加时扩容elementData为10。如需要则再次扩容,扩容大小为之前的1.5倍(本身+本身右移一位,即1+0.5=1.5倍)
3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如需扩容,则扩容至1.5倍。
Vector
介绍
1、底层也是数组
protected Object[] elementData
2、线程同步,即线程安全,类操作方法带有synchronized
3、考虑线程安全时,优先使用Vector
扩容算法
newCapacity=old Capacity+((capacityIncrement>0)?capacityIncrement:oldCapacity);
capacityIncrement默认为10,即默认大小为10,2倍扩容。
LinkedList
介绍
1、底层为双向链表和双端队列
2、元素可重复,允许null值
3、线程不安全
底层
1、first和last,指向首节点和尾节点
2、每个节点(Node对象)中有prev、next、item三个属性,prev指向前一个,next指向后一个。
add()源码
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++;
}
remove()源码
private E unlinkFirst (Node <E> f){
//assert f==first && f!=null;
final E element=f.item;
final Node<E> next=f.next;
f.item=null;
f.next=null;//help GC 垃圾回收
first=next;
if(next=null)
last=null;
else
next.prev=null;
size--;
modcount++;
return delement;
}