Queue

什么是Queue

  Queue 是 java.util 包下面的一个接口,继承了 Collection 接口,Queue的中文意思为队列;队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

类定义

方法定义

Deque

什么是Deque

Deque 是 java.util 包下面的一个接口,继承了 Queue 接口。Deque (double-ended queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行

类定义

方法定义

LinkedList

什么是LinkedList

LinkedList 是 java.util 包下的一个集合类,继承了 AbstractSequentialList 类,实现了 List、Deque、Cloneable、Serializable接口。LinkedList 是双向链表的实现,是非线程安全的,元素允许为null,允许重复元素

类定义

成员属性

 //链表容量transient int size = 0;/*** 指向第一个节点的指针*/transient Node<E> first;/*** 指向最后一个节点的指针。*/transient Node<E> last;

构造函数

 /*** 无参构造(空列表)*/public LinkedList() {}/*** 有参构造(按照集合的迭代器返回元素的顺序构造包含指定集合元素的列表)*/public LinkedList(Collection<? extends E> c) {this();//添加参数集合addAll(c);}

方法定义

私有函数 linkFirst(E e) 详解

 /*** 将参数 e 插入到头部*/private void linkFirst(E e) {//获取头节点final Node<E> f = first;//新建一个节点,尾部指向之前的头节点 firstfinal Node<E> newNode = new Node<>(null, e, f);//first 指向新建的节点first = newNode;//如果之前是空链表,新建的节点 也是最后一个节点if (f == null)last = newNode;else//原来的第一个节点(现在的第二个)头部指向新建的头结点f.prev = newNode;size++;modCount++;}/*** 静态内部类 Node* 是一个双向节点*/private static class Node<E> {//当前节点值E item;//下一个节点Node<E> next;//上一个节点Node<E> prev;//构造函数Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}

linkLast(E e) 详解

 /*** 将参数 e 插入到尾部*/void linkLast(E e) {//获取尾部节点final Node<E> l = last;//新建一个节点,头部指向之前的尾节点 lastfinal Node<E> newNode = new Node<>(l, e, null);//last 指向新建节点last = newNode;//如果之前是空链表,新建的节点也是第一个节点if (l == null)first = newNode;else//原来的尾节点尾部指向新建的尾节点l.next = newNode;size++;modCount++;}

linkBefore(E e, Node succ) 详解

 /*** 在非空节点 succ 之前插入元素 e*/void linkBefore(E e, Node<E> succ) {//获取指定节点 succ 前一个节点final Node<E> pred = succ.prev;//新建一个节点,头部指向 succ 前面的节点,尾部指向 succ 节点,数据为 efinal Node<E> newNode = new Node<>(pred, e, succ);//succ 节点头部指向 新建节点succ.prev = newNode;//如果 succ 前面的节点为空,说明 succ 是第一个节点,那现在新建的节点就变成第一个节点了if (pred == null)first = newNode;else//如果前面有节点,让前面节点的后一个节点为 新建节点pred.next = newNode;size++;modCount++;}

node(int index) 详解

 /*** 返回指定元素索引处的(非空)节点*/Node<E> node(int index) {//二分查找,如果小于 size 的一半,从头开始遍历if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;//大于 size 一半,从尾部倒着遍历} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}}

私有函数 unlinkFirst(Node f) 详解

 /*** 解除非空第一个节点f的链接*/private E unlinkFirst(Node<E> f) {//获取数据,最后返回final E element = f.item;获取头节点 f 后面一个节点final Node<E> next = f.next;//使头节点上数据为空f.item = null;//使头节点尾部指向空f.next = null;//头节点后边的节点变成第一个节点first = next;//如果头节点后面的节点为 null,说明移除这个节点后链表里没节点if (next == null)//尾节点也为nulllast = null;//如果头节点后面的节点不为 null,后面节点的前一个节点置空elsenext.prev = null;size--;modCount++;//返回数据return element;}

私有函数 unlinkLast(Node l) 详解

 /*** 解除最后一个非空节点 l 的链接*/private E unlinkLast(Node<E> l) {//获取数据,最后返回final E element = l.item;//获取前一个节点(即倒数第二个)final Node<E> prev = l.prev;//尾节点数据置空l.item = null;//尾指针置为空l.prev = null;//倒数第二个节点成为最后一个last = prev;//如果尾节点前面的节点为 null,说明移除这个节点后链表里没节点if (prev == null)//头节点也为nullfirst = null;//如果尾节点前面的节点不为 null,前面节点的后一个节点置空elseprev.next = null;size--;modCount++;//返回数据return element;}

unlink(Node x) 详解

 /*** 解除非空节点 x 的链接*/E unlink(Node<E> x) {//获取元素,最后返回final E element = x.item;//获取下一个节点final Node<E> next = x.next;//获取上一个节点final Node<E> prev = x.prev;//如果前面没有节点,说明 x 是第一个节点if (prev == null) {//第一个节点为 x 的下一个节点first = next;} else {//前面有节点,让前面节点跳过 x 直接指向 x 后面的节点prev.next = next;//将 x 前节点链接置空x.prev = null;}//如果后面没有节点,说 x 是最后一个节点if (next == null) {// x 前一个节点变为最后一个节点last = prev;} else {//后面有节点,让后面的节点指向 x 前面的节点next.prev = prev;//将 x 后节点链接置空x.next = null;}//将元素置空x.item = null;size--;modCount++;//返回数据return element;}

getFirst()、getLast() 详解

 /*** 获取列表中第一个元素*/public E getFirst() {//获取第一个节点final Node<E> f = first;if (f == null)throw new NoSuchElementException();//第一个节点不为空,返回第一个节点元素return f.item;}/*** 获取列表中最后一个元素*/public E getLast() {//获取最后一个节点final Node<E> l = last;if (l == null)throw new NoSuchElementException();//最后一个节点不为空,返回最后一个节点元素return l.item;}

removeFirst()、removeLast() 详解

 /*** 删除并返回列表中的第一个元素*/public E removeFirst() {//获取第一个节点final Node<E> f = first;if (f == null)throw new NoSuchElementException();//解除第一个非空节点的链接并返回元素return unlinkFirst(f);}/*** 删除并返回列表中的最后一个元素*/public E removeLast() {//获取最后一个节点final Node<E> l = last;if (l == null)throw new NoSuchElementException();//解除最后一个非空节点的链接并返回元素return unlinkLast(l);}

addFirst(E e)、addLast(E e) 详解

 /*** 在列表的开头插入指定的元素*/public void addFirst(E e) {//调用私有函数linkFirst(E e)linkFirst(e);}/*** 将指定的元素追加到列表的末尾*/public void addLast(E e) {//调用函数linkFirst(E e)linkLast(e);}

indexOf(Object o)、lastIndexOf(Object o) 详解

 /*** 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1*/public int indexOf(Object o) {int index = 0;//如果参数为nullif (o == null) {//从前往后循环节点for (Node<E> x = first; x != null; x = x.next) {//节点元素为nullif (x.item == null)//返回下标return index;index++;}//参数不为null} else {for (Node<E> x = first; x != null; x = x.next) {//如果相等,返回下标if (o.equals(x.item))return index;index++;}}//不存在返回-1return -1;}/*** 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1*/public int lastIndexOf(Object o) {int index = size;//如果参数为nullif (o == null) {//从后往前循环节点for (Node<E> x = last; x != null; x = x.prev) {index--;if (x.item == null)return index;}//参数不为null} else {for (Node<E> x = last; x != null; x = x.prev) {index--;//如果相等,返回下标if (o.equals(x.item))return index;}}//不存在返回-1return -1;}

contains(Object o) 详解

 /*** 如果此列表包含指定的元素,则返回 true */public boolean contains(Object o) {//元素所在下标!=-1返回true,反之falsereturn indexOf(o) != -1;}

size() 详解

 /*** 返回此列表中的元素数*/public int size() {//返回列表的元素数return size;}

add(E e)、add(int index, E element) 详解

 /*** 将指定的元素追加到此列表的末尾*/public boolean add(E e) {//调用linkLast(E e)将元素添加到末尾linkLast(e);return true;}/*** 在指定位置插入指定的元素*/public void add(int index, E element) {//判断 index 是否大于等于0并且小于元素数checkPositionIndex(index);//如果 index 等于 size,为最后一个if (index == size)//调用linkLast(E e)将元素添加到末尾linkLast(element);//如果不为最后一个else//调用linkBefore(E e,Node succ)在下标所在元素前面插入linkBefore(element, node(index));}private void checkPositionIndex(int index) {//判断 index 是否大于等于0并且小于元素数if (!isPositionIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}//判断 index 是否大于等于0并且小于等于元素数private boolean isPositionIndex(int index) {return index >= 0 && index <= size;}

remove(Object o)、remove(int index) 详解

 /*** 删除指定元素的第一个出现*/public boolean remove(Object o) {//指定元素为nullif (o == null) {//从前到后循环节点for (Node<E> x = first; x != null; x = x.next) {//当前节点元素为nullif (x.item == null) {//解除当前节点的链接unlink(x);return true;}}//指定元素不为null} else {for (Node<E> x = first; x != null; x = x.next) {//指定元素 等于 当前节点元素if (o.equals(x.item)) {//解除当前节点的链接unlink(x);return true;}}}return false;}/*** 删除该列表中指定位置的元素*/public E remove(int index) {//判断 index 是否大于等于0并且小于元素数checkElementIndex(index);//解除index所在节点的链接return unlink(node(index));}private void checkElementIndex(int index) {//index < 0 或者 大于元素数if (!isElementIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}//判断 index 是否大于等于0并且小于元素数private boolean isElementIndex(int index) {return index >= 0 && index < size;}

addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c) 详解

 /*** 按照指定集合迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾*/public boolean addAll(Collection<? extends E> c) {//调用addAll(int index, Collection<? extends E> c)return addAll(size, c);}/*** 将指定集合中的所有元素插入到此列表中,从指定的位置开始*/public boolean addAll(int index, Collection<? extends E> c) {//判断 index 是否大于等于0并且小于等于元素数checkPositionIndex(index);//将指定集合转为数组Object[] a = c.toArray();//获取数组长度int numNew = a.length;//数组长度为0,返回falseif (numNew == 0)return false;//创建两个节点,分别指向要插入位置前面和后面的节点Node<E> pred, succ;//如果index 等于 元素数,说明要添加到末尾if (index == size) {succ = null;pred = last;} else {//要添加到中间, succ 指向 index 位置的节点,pred 指向它前一个succ = node(index);pred = succ.prev;}//循环要添加的数组for (Object o : a) {@SuppressWarnings("unchecked") E e = (E) o;//创建新节点,头指针指向 predNode<E> newNode = new Node<>(pred, e, null);//如果 pred 为空,说明新建的这个是头节点if (pred == null)first = newNode;else//反之 pred 后一个节点指向新建的节点pred.next = newNode;//pred 后移一位pred = newNode;}//后面节点为null,添加完成if (succ == null) {//修改尾指针 lastlast = pred;} else {//否则 pred 下一个节点指向后面的元素,succ 前一个节点指向 predpred.next = succ;succ.prev = pred;}//元素个数增加size += numNew;modCount++;return true;}

clear() 详解

 /*** 删除列表中所有元素*/public void clear() {//循环列表for (Node<E> x = first; x != null; ) {//获取下一个节点Node<E> next = x.next;//置空当前节点元素、下一个节点、上一个节点x.item = null;x.next = null;x.prev = null;x = next;}//置空头、尾节点first = last = null;size = 0;modCount++;}

get(int index) 详解

 /*** 获取列表中指定位置的元素*/public E get(int index) {//判断 index 是否大于等于0并且小于元素数checkElementIndex(index);//返回指定元素索引处的(非空)节点return node(index).item;}

set(int index, E element) 详解

 /*** 用指定元素替换列表中指定位置的元素*/public E set(int index, E element) {//判断 index 是否大于等于0并且小于元素数checkElementIndex(index);//获取元素索引处的(非空)节点Node<E> x = node(index);//获取旧元素E oldVal = x.item;//赋值新元素x.item = element;//返回旧元素return oldVal;}

offer(E e)、offerFirst(E e)、offerLast(E e) 详解

 /*** 将指定元素添加为列表的最后一个元素*/public boolean offer(E e) {return add(e);}/*** 在列表的头部插入指定的元素*/public boolean offerFirst(E e) {addFirst(e);return true;}/*** 在列表的末尾插入指定的元素*/public boolean offerLast(E e) {addLast(e);return true;}

peek()、peekFirst()、peekLast() 详解

 /*** 获取头元素但不删除,如果此列表为空,则返回 null */public E peek() {final Node<E> f = first;return (f == null) ? null : f.item;}/*** 获取头部元素但不删除,如果此列表为空,则返回 null */public E peekFirst() {final Node<E> f = first;return (f == null) ? null : f.item;}/*** 获取尾部元素但不删除,如果此列表为空,则返回 null*/public E peekLast() {final Node<E> l = last;return (l == null) ? null : l.item;}

poll()、pollFirst()、pollLast() 详解

 /*** 获取并删除头部元素,如果此列表为空,则返回 null */public E poll() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);}/*** 获取并删除头部元素,如果此列表为空,则返回 null */public E pollFirst() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);}/*** 获取并删除尾部元素,如果此列表为空,则返回 null */public E pollLast() {final Node<E> l = last;return (l == null) ? null : unlinkLast(l);}

pop()、push(E e) 详解

 /*** 从此列表表示的堆栈中弹出一个元素*/public E pop() {return removeFirst();}/*** 将元素推送到由此列表表示的堆栈上*/public void push(E e) {addFirst(e);}

toArray()、toArray(T[] a) 详解

 /*** 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组*/public Object[] toArray() {//创建同等大小数组Object[] result = new Object[size];int i = 0;//循环获取节点元素for (Node<E> x = first; x != null; x = x.next)result[i++] = x.item;//返回元素集合return result;}/*** 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); * 返回的数组的运行时类型是指定数组的运行时类型*/public <T> T[] toArray(T[] a) {//如果指定数组小于元素数,创建新数组if (a.length < size)a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);int i = 0;Object[] result = a;//循环获取节点元素for (Node<E> x = first; x != null; x = x.next)result[i++] = x.item;//适应大小if (a.length > size)a[size] = null;//返回元素集合return a;}

Queue、Deque、LinkedList学习相关推荐

  1. python 中的queue, deque

    python3 deque(双向队列) 创建双向队列 import collections d = collections.deque() append(往右边添加一个元素) import colle ...

  2. 【C++ STL学习之三】容器deque深入学习

    C++ STL容器deque和vector很类似,也是采用动态数组来管理元素. 使用deque之前需包含头文件: #include <deque> 它是定义在命名空间std内的一个clas ...

  3. python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

  4. java lifo 队列_1.8 Java 队列 Queue、双端队列 Deque - Java 知识总结与学习

    queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口.除了基本的 Collection 操作外,队列还 ...

  5. Java中的queue和deque

    2019独角兽企业重金招聘Python工程师标准>>> 1.Queue 队列, 一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则.Java中,Linke ...

  6. 【Java 集合】ArrayList、LinkedList、Stack、Queue、Set、Map, 迭代器 Iterable、Iterator,Collections类

    集合类型 数组的局限性 ArrayList(常用方法 + 基本使用) ArrayList - retainAll ArrayList - toArray ArrayList 的遍历(5种) Array ...

  7. java基础:13.2 集合框架 - LinkedList、Queue

    文章目录 1.Deque 2.Queue 3.ArrayList 和 LinkedList 的区别 4.练习 与ArrayList一样,LinkedList也实现了List接口,诸如add,remov ...

  8. Java API(十五):Queue队列、Deque栈、Map集合

    文章目录 Java API 一.Queue队列 1.Queue接口及LinkedList实现 2.Queue常用方法 二.Deque栈 1.Deque接口及LinkedList实现 2.Deque常用 ...

  9. Java中集合遍历方式(List、Set、Queue、Deque、Stack、Map)

    什么是集合?通俗的讲,集合就是存储一组数据的容器,那么,相比较于同样是存储数据的数组,集合的优势就体现在集合的长度是可变的,而数组的长度是固定的.在我们常见的集合中,主要有两大类: Collectio ...

最新文章

  1. 看图说OpenGL之二之投影矩阵求法
  2. 北航c语言简答题目汇总_2020下半年至2021年【化学/计算机/生物类】国际竞赛汇总!...
  3. ubuntu 创建github公钥
  4. 内置方法-str方法定制变量输出信息
  5. leetcode 81. 搜索旋转排序数组 II(二分查找)
  6. codeforces679C Bear and Square Grid(dfs优化)
  7. JVM 内存管理机制
  8. C++可变长数组vector的使用
  9. LNMP环境搭建 centos7 nginx1.12 mysql5.6 php7
  10. 哪些因素会影响数据质量
  11. 影视.20190507
  12. frpc在linux下开机启动,frp 设置开机自启
  13. Sping--AOP--XML
  14. arduino雨滴传感器和舵机控制
  15. 鸿蒙手机电脑无缝对接,万物互联?华为鸿蒙OS超级终端功能曝光可一键连接附近设备...
  16. C++ 面向对象高级开发(侯捷)
  17. 2018中南大学 计算机考研分数,2018中南大学考研分数线多少分?
  18. 阿里云 mysql 高可用_如何在阿里云上构建高可用应用
  19. H5页面上传图片控件
  20. Docker下删除镜像报错 (cannot be forced) - image has dependent child images

热门文章

  1. ABP Vnext 学习02-授权中心 重写Login 页面
  2. 报错:致命错误:Python.h:没有那个文件或目录
  3. linux下qt不能加载控件,找不到或加载Qt平台插件“xcb”
  4. 【电源专题】LDO基础——压降
  5. 电缆压降损耗计算方法
  6. spring cloud读取配置文件
  7. SpringCloud的@Value注解及GitLab配置使用
  8. 什么是体系认证,企业进行认证有何意义?
  9. 淡淡的感动——电影《听说》观后感
  10. 论文参考文献类型代码及书写格式