[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 ...
随机推荐
- yii2 控制器里 action 大小写组合造成的路由问题
yii1中, 若存在如下控制器 class BindController extends CController { public function actionGetMobilePhone () { ...
- C#中的操作数据库的SQLHelper类
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- List、Set、Map的使用
1.List(接口) List接口的特点: a.List接口可以存放任意数据,且在接口中,数据可以重复. b.List中提供了高效的插入和移除多个元素的方法. List常用的子类 a.ArrayLis ...
- EBS基础—表的后缀
1._ALL或无后缀:基表,所有对数据操作最终都是对基表的操作,表包含所有不同经营单位的信息,多组织环境. 2._B/_T:也是一种基表.一些数据和验证存储在此表中. 3._TL:语言的基表,TL表支 ...
- iOS横竖屏切换的一些坑(持续更新)
最近在做视频类的App,遇到视频滚动播放的坑,紧接着就是横竖屏问题.之前太过天真不想做横竖屏配置.只是想旋转视频View,但是分享什么的包括AlertView还是竖屏样式,项目着急上线(1周提交一次也 ...
- 认识<hr>标签,添加水平横线
在信息展示时,有时会需要加一些用于分隔的横线,这样会使文章看起来整齐些.如下图所示: 语法: html4.01版本 <hr> xhtml1.0版本 <hr /> 注意: 1. ...
- 浅谈C++ Lambda 表达式(简称LB)
C++ 11 对LB的支持,对于喜欢Functional Programming的人来说,无疑是超好消息.它使得C++进入了和C#,JavaScript等现代流行的程序设计语言所代表的名人堂. 不熟悉 ...
- Bit Map解析
1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空 ...
- C++ Primer 5th 第15章 面向对象程序设计
面向对象程序设计的核心思想是:数据抽象.继承和动态绑定. 数据抽象:将类的接口与实现分离: 继承:定义相似类型并对相似关系建模: 动态绑定:一定程度上上忽略相似类型间的区别,用同一方式使用它们. 1. ...
- angularJS学习笔记二
angularJS四个特性 1.MVC <!doctype html> <html ng-app> <head> <meta charset="ut ...