[Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图。只是画了关注的部分,并不是完整的关系图。本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记。关于 List 接口的笔记,可以参考上一篇博文 List / ArrayList - 源代码学习笔记

Queue
1. 继承 Collection 接口,并提供了额外的插入、提取和查看元素的方法。新增的方法都有两种形式:当操作失败时,抛出异常或者返回一个特殊值。特殊值可以是 null 或者 false ,这取决于方法本身。
| Throws exception | Returns special value | |
| Insert | add(e) | offer(e) |
| Remove | remove() | poll() |
| Examine | element() | peek() |
使用 offer(e) 插入失败时会返回 false ,这一般用于有大小限制的 Queue 实现中。
remove(), poll() 会删除队列的第一个元素,并返回被删除的元素。
element(), peek() 会返回队列的第一个元素,但不会删除它。
表格中罗列的是 Queue 定义的所有方法。
2. 典型的 Queue 按照 FIFO(first-in-first-out) 来排序,不过这不是必须的。例如,优先队列 PriorityQueue 是根据比较器,或者元素自然序来排序的。另一种数据结构 Stack 则是按照 FILO(first-in-last-out) 来排序的。
3. 没有定义阻塞队列 (blocking queue) 的方法。这些方法一般拥有并发编程中,由 java.util.concurrent.BlockingQueue 实现。
4. 应当禁止插入 null 元素,因为 poll(), peek() 方法使用 null 表示当前队列为空。
Deque
1. Deque 代表着 Double Ended Queue ,即双端队列。两端都允许插入、删除元素。
2. 提供了额外的插入、提取和查看元素的方法。新增的方法都有两种形式:当操作失败时,抛出异常或者返回一个特殊值。这点和 Queue 相似。
| First Element (Head) | Last Element (Tail) | |||
| Throws exception | Special value | Throws exception | Special value | |
| Insert | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
| Remove | removeFirst() | pollFirst() | removeLast() | pollLast() |
| Examine | getFirst() | peekFirst() | getLast() | peekLast() |
通过表格可以观察到,Deque 的方法名以 First 或者 Last 结尾,提供的功能和 Queue 类似,
3. 由于允许双端操作元素,所有 Deque 即可以被当做 Queue 来使用,FIFO(first-in-first-out),也可以被当做 Statck 来使用 FILO(first-in-last-out)。虽然 Deque 提供的功能更多,但是实际应用中,不如 Queue 常用。
4. 无论 Deque 被当做 Queue 还是 Stack 来使用,peek() 方法都能正常被使用,因为它总是返回 Deque 的第一个元素。
5. 应该禁止插入 null 元素。这点和 Queue 相似。
LinkedList
1. 可以简化地理解为实现了 List, Queue 两个接口的集合。
2. 底层的数据结构是双向列表。通过下标查找元素的方法 node(int index) ,先判断离头、尾哪边更近,然后从较近的一端开始找起。
3. 可以包含 null 元素。
4. 迭代器采用 fail-fast 设计思路。这点和 ArrayList 类似。
5. 元素以节点 Node 为单位,其中 Node 是内部类。在看实现代码时可以通过画图来帮助理解,方法实现的代码和 LeetCode 上的练习有些相似。
6. LinkedList 的方法很多,仅用于操作元素的方法就有 24 个,其中,有 6 个是具体的操作实现并被修饰为non-public ,有 18 个是 public 的对外接口。之所有有那么多对外接口,是因为它声明了 Deque 和 Queue 的接口,要实现他们定义全部方法。6 个具体实现分别为:
| Link Method | Unlinke Method |
| linkFirst(E) | unlinkFirst(Node<E>) |
| linkLast(E) | unlinkLast(Node<E>) |
| linkBefore(E, Node<E>) | unlink(Node<E>) |
个人觉得,这个设计使得 LinkedList 功能比较多而杂。
7. indexOf(Object) 和 remove(Object) 方法,在 List 中查找 Object 时,先判断 Object 是否为 null ,然后采用合适的比较方法。以 remove(Object) 为例,代码如下
public boolean remove(Object o) {
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;
}
8. addAll(int index, Collection<? extends E> c) 方法大体思路如下
a. 通过 c.toArray() 获得待插入元素的数组形式
b. 从指定的位置 index 开始,依次插入待插入的元素
c. 将 index 原来的 next 元素指向新插进来的最后一个元素。
9. clear() 方法,删除链表中间的所有连接,帮助垃圾回收器回收内存。
10. toArray():Object 和 toArray(T[]):T[] 方法都会将 List 中的元素全部拷贝到数组中,然后返回这个数组。如果知道 List 元素的类型时,推荐使用 toArray(T[]):T[] ,这样能减少内存分配的开销。
Jdk 版本: jdk1.8.0_31.jdk
[Java] LinkedList / Queue - 源代码学习笔记的更多相关文章
- [Java] List / ArrayList - 源代码学习笔记
在阅读 List / ArrayList 源代码过程中,做了下面的笔记. LinkedList 的笔记较多,放到了另一篇博文 LinkedList / Queue- 源代码学习笔记 List List ...
- [Java] Map / HashMap - 源代码学习笔记
Map 1. 用于关联 key 和 value 的对象,其中 key 与 key 之间不能重复. 2. 是一个接口,用来代替 Java 早期版本中的 Dictionary 抽象类. 3. 提供三种不同 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- jQuery源代码学习笔记_工具函数_noop/error/now/trim
jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...
- Java后端高频知识点学习笔记1---Java基础
Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...
- 20165326 java第七周学习笔记
第七周学习笔记 MySQL(数据管理系统)学习 知识点总结: 不能通过关闭MySQL数据库服务器所占用的命令行窗口来关闭MySQL数据库. 如果MySQL服务器和MySQL管理工具驻留在同一台计算机上 ...
- Java超简明入门学习笔记(一)
Java编程思想第4版学习笔记(一) 第二章 一切都是对象(Hello World) 这个笔记本主要记录了我在学习Java编程思想(第4版,中文版)的过程中遇到的重难点及其分析.主要 ...
- 《Java编程思想》学习笔记(二)——类加载及执行顺序
<Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
随机推荐
- Notice : Soft open files now is 1024, We recommend greater than 10000
在研究 workerman 时, 报了这个错误, 感觉只是个notice级别的, 就一直给忽略掉了, 今天有时间, 就查了一下. 其实本质就是 ulimit 这个命令 打开一个命令行, 输入 ulim ...
- Word 查找替换,通配符一览表
Word查找替换详细用法及通配符一览表 使用通配符要查找“?”或者“*”,可输入“\?”和“\*”,\1\2\3依次匹配数对括号内容查找(a)12(b) 替换\2XY\1 结果:bXYa ([ ...
- Core Python Notes
开发需要在读 Python 核心编程,一些 Point 记录如下. ******************************************** 版本相关 标准版的 Python 是用 C ...
- HDU5311
题意:给一个指定的字符串a,要求分成三段,然后再给定另外一个字符串b,要求a中的三段能否在b中找到. 思路:枚举+模拟,首先枚举给定的字符串a,因为分成三段,所以一共有(1+9)*9/2种情况,对于分 ...
- IE8-下背景色半透明滤镜在jquery动画中失效问题记录
前两天,UIer跟我说,把这些按钮都悬浮在这个图片上!我心中千万头草泥马奔过,图片各种各样.花花绿绿.五颜六色的,这几个按钮也没有多大的光环围绕,用户一眼看上去恐怕会以为这是图片的一部分吧!~~~我假 ...
- Eclipse4.4安装旧版本插件报错 Failed to prepare partial IU
Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0.8. work around: go to Help -> ...
- iOS关于sqlite3操作
原文:http://hi.baidu.com/clickto/blog/item/0c6904f787c34125720eec87.html iPhone中支持通过sqlite3来访问iPhone本地 ...
- C# trace debug TraceListener调试信息详解
在C#编程中,可能要碰到把调试信息输出的问题,我们可以自己把信息显示在某个控件上,但是MS自己提供了一套机制帮助我们输出一些调试信息,这些信息有助于我们判断程序的走向,不用自己再去额外写调试代码了. ...
- 网络编程Socket之TCP
服务端: 1. 创建 ServerSocket 对象并监听一个端口 2. 调用accept()方法等待客户端的连接(阻塞式) 3. 输入流(记取客户端发送过来的数据) 4. 输出流(响 ...
- 嵌入式开发(一) Ubuntu12.04下搭建交叉编译环境
操作系统:Ubuntu12.04 AMD64位 交叉编译环境:arm-Linux gcc版本4.4.3 前言: 首先理解一下交叉编译的意思.我们要给嵌入式设备写应用程序,但是又不能在嵌入式设备上完成所 ...