[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 ...
随机推荐
- centos 安装 lnmp
直接yum install nginx不行,要先处理下源,下面是安装完整流程 1. rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/ng ...
- 使用python求字符串或文件的MD5
使用python求字符串或文件的MD5 五月 21st, 2008 #以下可在python3000运行. #字符串md5,用你的字符串代替'字符串'中的内容. import hashlib md5=h ...
- 自己编写SqlHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- asp.net 中的那些编译错误(1):控件包含代码块(即<% ... %>),因此无法修改控件集合
在编译页面的时候出现:控件包含代码块(即 <% ... %>),因此无法修改控件集合错误 一般原因是: 在<head runat="server">< ...
- 导入excel错误:外部表不是预期的格式 解决方案(Oledb)
-----转载:http://blog.csdn.net/zhou349398998/article/details/8740424 环境:win7+iis7+Office2007 在asp.net网 ...
- ubuntu下apache与php配置
实验环境 uname -a Linux tomato 4.4.0-34-generic #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 x86_64 x86_6 ...
- Ubuntu安装google chrome过程
Ubuntu安装google chrome过程: # wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd6 ...
- LINUX系统安装MYSQL命令,纯手打
1.下载安装包 wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz 2. ...
- C盘不能新建文件的问题解决办法
C盘不能新建文件的问题解决办法 主要症状: 1.C 盘文件不能修改2.C 盘不能新建文件3.总之就是只能读取不能,写入和修改这样对于平时操作造成了极其的不方便~~~复制文件到C 盘会提示:错误0×80 ...
- JQuery执行函数与window.onload函数
JavaScript和HTML之间的交互: 1.通过用户和浏览器操作页面时引发的事件来处理的. 2.当文档或者它的某些元素发生某些变化时,浏览器会自动生成一个事件. 例如:当浏览器装载完一个文档后,会 ...