什么是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
|
什么时候扩容
链表没有终点不需要扩容
是否线程安全
线程不安全
使用注意事项
引用