java源码分析08-LinkedList
2015-11-14 22:18
471 查看
喜欢一个人,就会喜欢她的一切吗?
今天,我们来看下LinkedList的结构。
LinkedList内部其实是双向链表实现的,而且拥有轮询以及出栈的功能。
增删改查:
每次增加新的元素,都是在链表末尾加上,注意当前时刻的末尾节点是否为空,然后add之后需要将size加一,modCount也需要加一。
查询的时候,需要先检查是否为有效查询,也就是下标是否在0与size-1之间。
此处有一个优化,首先判断下标是在中间节点的左边还是右边,如果在左边就从头结点开始遍历;否则从尾结点开始遍历查询。
轮询机制
此处为什么定义一个final类型的引用,而没有直接unlinkFirst(first)?
删除头结点,第一步,提前存储头结点的后继;第二,头结点的值设为null,其下一节点为null;第三,将first指向之前存储的已删除节点的后继。第四,判断后继是否为空,为空那么last为null,否则后继的前驱为null。
今天,我们来看下LinkedList的结构。
LinkedList内部其实是双向链表实现的,而且拥有轮询以及出栈的功能。
增删改查:
public boolean add(E e) { linkLast(e); return true; }
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++; }
每次增加新的元素,都是在链表末尾加上,注意当前时刻的末尾节点是否为空,然后add之后需要将size加一,modCount也需要加一。
public E get(int index) { checkElementIndex(index); return node(index).item; }
private void checkElementIndex(int index) { if (!isElementIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
private boolean isElementIndex(int index) { return index >= 0 && index < size; }
查询的时候,需要先检查是否为有效查询,也就是下标是否在0与size-1之间。
Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; }
此处有一个优化,首先判断下标是在中间节点的左边还是右边,如果在左边就从头结点开始遍历;否则从尾结点开始遍历查询。
轮询机制
public E poll() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); }
此处为什么定义一个final类型的引用,而没有直接unlinkFirst(first)?
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 element; }
删除头结点,第一步,提前存储头结点的后继;第二,头结点的值设为null,其下一节点为null;第三,将first指向之前存储的已删除节点的后继。第四,判断后继是否为空,为空那么last为null,否则后继的前驱为null。
public int indexOf(Object o) { int index = 0; if (o == null) { for (Node<E> x = first; x != null; x = x.next) { if (x.item == null) return index; index++; } } else { for (Node<E> x = first; x != null; x = x.next) { if (o.equals(x.item)) return index; index++; } } return -1; }
相关文章推荐
- Java继承关系中类的初始化顺序
- Spring Boot应用基本配置说明
- Java迭代法求所有八皇后问题的解
- 什么是序列化,Java中序列化的实现
- java判断多个点是否在同一直线上
- java问题:类的定义,对象的定义?
- 500G JAVA视频网盘分享 (Jeecg社区)
- Java的IO
- JAVA Executor简介
- java虚拟机内存回收详细流程图
- Java json && 框架中的 泛型 + 反射
- CKFinder(Java版)以时间作上传文件的保存路径
- Java Socket实现多客户端通信(通过DOS命令窗口模拟)
- 插入排序Java代码实现
- 【Java小项目】图片浏览器
- Java Socket实现1V1简单通信(通过Dos命令窗口实现)
- 10011---JavaWeb基础---JSP概述
- Java并发(多线程)
- Java入门(四)final关键字
- JAVA中JVM简单学习