什么是LinkedList
ArrayList底层是由链表组成的一种数据结构,可以进行动态的增删改查
LinkedList用来干嘛
LinkedList一般用于对数据的存储
源码解析
- 数据的存储
- 数据的操作
- 什么时候扩容
- 是否线程安全
带上问题去找答案 
 
数据的存储
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 | public class LinkedList<E>     extends AbstractSequentialList<E>     implements List<E>, Deque<E>, Cloneable, java.io.Serializable {     transient int size = 0;     /**      * Pointer to first node.      * Invariant: (first == null && last == null) ||      *            (first.prev == null && first.item != null)      */     transient Node<E> first;     /**      * Pointer to last node.      * Invariant: (first == null && last == null) ||      *            (last.next == null && last.item != null)      */     transient Node<E> last;
 | 
数据的操作
add (addFirst addLast类似)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 | public boolean add(E e) {     linkLast(e);     return true; } void linkLast(E e) {     final Node<E> l = last;//获取last     final Node<E> newNode = new Node<>(l, e, null);//创建Node     last = newNode;//last为新的节点 	//如果当前l为空,表示是第一次添加,那么first也会=新的节点 	//如果第一次添加就是first=last=newNode     if (l == null)         first = newNode;     //l不为空也就是说不是第一次添加 	//当前的last=newNode,而现在由于创建Node的时候已经吧newNode.prev=last也就是说现在是维护双向的关系     else         l.next = newNode;     size++;     modCount++; } //创建Node参数prev上一个,element当前元素,next下一个。添加的时候给定prev为last,element为当前,next为空 Node(Node<E> prev, E element, Node<E> next) { 	this.item = element; 	this.next = next; 	this.prev = prev; }
 | 
删除对象 linkedList可以存储null
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
 | public boolean remove(Object o) { 	//删除元素为空从first开始遍历判断为空 	if (o == null) { 		for (Node<E> x = first; x != null; x = x.next) { 			if (x.item == null) { 				unlink(x); 				return true; 			} 		} 	} else { 		for (Node<E> x = first; x != null; x = x.next) { 			if (o.equals(x.item)) { 				unlink(x); 				return true; 			} 		} 	} 	return false; } /* 解除关系 1.将当前Node的prev next item都设置为空 2.将prev节点的next直接指向next(如果prev为空将first指向next) 3.强next节点的prev直接指向prev(如果next为空将last指向prev) */ E unlink(Node<E> x) { 	// assert x != null; 	final E element = x.item;//当前元素 	final Node<E> next = x.next;//当前元素的下一个节点 	final Node<E> prev = x.prev;//当前元素的上一个节点 	if (prev == null) {//如果上一个节点为空,那么first将直接指向next 		first = next; 	} else { 		prev.next = next;//当前元素不为空将prev的next直接指向当前元素的下一个节点() 		x.prev = null; 	} 	if (next == null) { 		last = prev; 	} else { 		next.prev = prev; 		x.next = null; 	} 	x.item = null; 	size--; 	modCount++; 	return element; }
 | 
获取
| 1
 | 因为是链表结构,只支持getFirst,getLast
 | 
什么时候扩容
链表没有终点不需要扩容
是否线程安全
线程不安全
使用注意事项
引用