LinkedList源码解析
2017-03-01 00:00
330 查看
摘要: 闲来无事^_^
数据的操作
什么时候扩容
是否线程安全
带上问题去找答案
删除对象 linkedList可以存储null
获取
LinkedList源码解析
什么是LinkedList
ArrayList底层是由链表组成的一种数据结构,可以进行动态的增删改查LinkedList用来干嘛
LinkedList一般用于对数据的存储源码解析
数据的存储数据的操作
什么时候扩容
是否线程安全
带上问题去找答案
数据的存储
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类似)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
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; }
获取
因为是链表结构,只支持getFirst,getLast
什么时候扩容
链表没有终点不需要扩容是否线程安全
线程不安全使用注意事项
LinkedList不支持直接定位到元素引用
jdk源码相关文章推荐
- Java集合---LinkedList源码解析
- LinkedList源码解析
- Java集合---LinkedList源码解析
- LinkedList源码解析
- 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析
- LinkedList源码解析
- 第三章 LinkedList源码解析
- Java 集合系列05之 LinkedList源码解析
- Java集合---LinkedList源码解析
- LinkedList源码解析
- 【JDK】:ArrayList和LinkedList源码解析
- 【Java深入研究】2、JDK 1.8 LinkedList源码解析
- LinkedList源码解析
- LinkedList源码解析
- LinkedList源码解析
- LinkedList源码解析
- LinkedList源码解析
- LinkedList源码解析
- Java集合---LinkedList源码解析
- java jdk1.8 LinkedList源码解析