[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 ...
随机推荐
- 案例:利用累加器计算前N个学生的总成绩和平均成绩
/* *录入N个学生的成绩,并求出这些学生的总成绩和平均成绩! * */ import java.util.Scanner; public class SumTest{ public static v ...
- BaseAdapter以及对ListView的优化(转)
背景 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属ge ...
- codevs2492上帝造题的七分钟 2(线段树)
/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还 ...
- 移动端网站或APP点击后出现闪动或灰色背景
隐藏文本框阴影 input, textarea{-webkit-appearance: @none;} 取消手机点击屏幕时,会出现的灰块 html,body{-webkit-text-size-adj ...
- Android中的BroadCast静态注册与动态注册
1.静态注册 新建MyBroadcast类继承BroadcastReceiver,实现onReceive方法 /** * Author:JsonLu * DateTime:2015/9/21 16:4 ...
- linux下系统定时任务配置----crontab(mysql定时备份)
crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...
- 低字节序和高字节序相互转换(Little Endian/Big Endian)
这个例子展示了如何转换整形数字的字节顺序,该方法可以用来在little-endian和big-endian之间转换. 说明:Windos(x86,x64)和Linux(x86,x64)都是little ...
- qt实现类似QQ伸缩窗口--鼠标事件应用
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://blog.csdn.net/hiwubihe/article/details/38678305,qq:1269122125. 上一章 ...
- 面向对象设计模式之Interpreter解释器模式(行为型)
动机:在软件构建过程中 ,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化.在这种情况下,将特定领域的问题表达为某种语法规则的句子,然后构建一个 ...
- Eclipse+Pydev +Django搭建开发环境时容易出错的几点
1.注意安装的软件和系统的位数是否匹配. 2.安装Django框架的时候注意是否安装了setuptools工具.在Python中,安装第三方模块,是通过setuptools这个工具完成的.Python ...