文章目录
1. ArrayList
随机访问效率很高,但插入和删除性能比较低
1.1 特点
2. LinkedList
LinkedList同样实现了List接口,它的特点与ArrayList正好相反。同时还实现了Deque和Queue接口。可以按照队列、栈和双端队列的方式进行操作。
2.1 用法
2.1.1 创建方式
List<String> list = new LinkedList<> ();
List<String> list1 = new LinkedList<> (Arrays.asList (new String []{"a","b","c"}));
2.1.2 Queue接口定义
public interface Queue<E> extends Collection<E>{
boolean add(E e);//在尾部添加元素,队列满时抛异常
boolean offer(E e);//在尾部添加元素,队列满时返回false
E remove();//删除头部元素,队列空时抛异常
E poll();//删除头部元素,队列空时返回null
E element();//查看头部元素,队列空时抛异常
E peek();//查看头部元素,队列空时返回null
}
2.1.3 Queue举例
Queue<String> queue = new LinkedList<> ();
queue.offer("a");
queue.offer("b");
queue.offer("c");
while(queue.peek()!=null){
System.out.println (queue.poll ());
}
Queue<Integer> q = new LinkedList<>();
for (int i=0;i<5;i++){
q.offer(i);
}
while (!q.isEmpty()) System.out.println(q.poll());
}
2.1.4 Deque举例
Deque<String> stack = new LinkedList<> ();
stack.offer("a");
stack.offer("b");
stack.offer("c");
while(stack.peek()!=null){
System.out.println (stack.pop ());
}
2.2 特点
3. ArrayDeque
3.1 实例变量
private transient E[] elements;
private transient int head;
private transient int tail;
3.2 原理
ArrayDeque的高效来源于head和tail这两个变量。
3.2.1 循环数组
对于一般的数组,比如arr ,第一个元素是arr[0],最后一个元素为arr[arr.length-1]。
但是ArrayDeque中的数组,他是一个逻辑上的循环数组,有head和tail这两个变量决定
a.当head=tail,则数组为空,长度为0;
b.当head<tail,则第一个元素为elements[head],最后一个元素为elements[tail-1],长度为tail -head,元素索引从head到tail-1.
c.当tail<head&&tail==0,则第一个元素为elements[head],最后一个为elements[elements.length-1],元素索引从head到elements.length-1.
d.当0<tail<head,则会形成循环,第一个元素是elements[head],最后一个为elements[tail-1],元素索引从head到 elements.length-1,r然后再从0到tail-1.
3.2.2 构造方法
public ArrayDeque(){
elements = (E[])new Object[16];
}
分配了一个长度为16的数组。如果有参数numElements,代码为
public ArrayDeque(int numElements){
allocateElements(numElements);
}
public ArrayDeque(Collection<? extends E> c ){
allocteElements(c.size ());
addAll(c);
}
3.2.3 头部添加和删除
关键方法
addFirst();
removeFirst();//removeFirst()主要调用了pollFirst()方法