ArrayDeque阅读记录

2023-12-13 02:12
文章标签 记录 阅读 arraydeque

本文主要是介绍ArrayDeque阅读记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

1.对Queue接口进行实现

2.底层的数据结构还是数组,同时还是双向的,有前后指针

3.不是线程安全的

4.可以当作队列和栈来使用,选择使用队列时,ArrayDeque推荐首选

5.不可以添加null数据,会抛异常

一些重要变量和常量:

	//元素数组transient Object[] elements; //头指针,指向头部的第一个元素的位置transient int head;//尾指针,将下一个元素添加到尾部的索引,也就是指向尾端第一个可以插入元素的空位transient int tail;//最小容量,同时必须时2的倍数private static final int MIN_INITIAL_CAPACITY = 8;

部分源码分析:

1.初始化对象

    //还是分配16的空间内存 public ArrayDeque() {elements = new Object[16];}

2.添加头节点

    /*** 在首部添加节点*/public void addFirst(E e) {//如果插入值为空,则抛出异常if (e == null)throw new NullPointerException();//这里定位和之前hashmap中定位table的位置差不多,ArrayDeque本身是一个循环数组,//head = (head - 1) & (elements.length - 1)//在这里相当于取余操作,同时也保证了下标不为负值elements[head = (head - 1) & (elements.length - 1)] = e;//添加元素之后,如果头指针和尾指针相同,才会进行扩容,看名字就晓得,扩大两倍if (head == tail)doubleCapacity();}//也是添加头节点的方法,这里是返回是否添加成功public boolean offerFirst(E e) {addFirst(e);return true;} 

3.扩容

     /*** 扩容操作, 扩大两倍*/private void doubleCapacity() {assert head == tail;int p = head;int n = elements.length;// 头节点右边元素的个数int r = n - p; //扩容,新容量是旧容量的两倍int newCapacity = n << 1;if (newCapacity < 0)throw new IllegalStateException("Sorry, deque too big");Object[] a = new Object[newCapacity];//先复制右边的元素System.arraycopy(elements, p, a, 0, r);//再复制左边的元素System.arraycopy(elements, 0, a, r, p);//指针重新初始化elements = a;head = 0;tail = n;}

4、添加尾节点

   /*** 插入节点到尾部*/public void addLast(E e) {if (e == null)throw new NullPointerException();//直接添加即可,因为tail指向尾端第一个可以插入元素的空位elements[tail] = e;//添加之后再做是否需要扩容的判断if ( (tail = (tail + 1) & (elements.length - 1)) == head)doubleCapacity();}//也是另外一个添加尾节点的方法,返回成功与否public boolean offerLast(E e) {addLast(e);return true;}

5.删除头结点

    /*** 删除头结点,返回删除的元素,如果删除的元素为null,返回null*/public E pollFirst() {int h = head;@SuppressWarnings("unchecked")E result = (E) elements[h];// 如果队列为空if (result == null)return null;//删除头结点,将头结点这个位置设为null,为了GCelements[h] = null;     // Must null out slot//头指针前移head = (h + 1) & (elements.length - 1);return result;}/*** 这个也是删除头节点,但如果删除的元素为null,抛出异常*/public E removeFirst() {E x = pollFirst();if (x == null)throw new NoSuchElementException();return x;}

6.删除尾节点

    /*** 删除尾结点,返回删除的元素,如果删除的元素为null,返回null*/public E pollLast() {//tail是指向尾端第一个可以插入元素的空位,所以他前面就是尾节点的索引,//这里进行-1即可获取尾节点的索引地址int t = (tail - 1) & (elements.length - 1);@SuppressWarnings("unchecked")E result = (E) elements[t];if (result == null)return null;elements[t] = null;//将尾指针设在当前位置,也就是被删除尾节点的位置tail = t;return result;}/*** 这个也是删除尾节点,但如果删除的元素为null,抛出异常*/public E removeLast() {E x = pollLast();if (x == null)throw new NoSuchElementException();return x;}

还有些获取某个节点,实现代码都差不多,这里就不一一列出来了,到这ArrayDeque也结束了。

这篇关于ArrayDeque阅读记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/486791

相关文章

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d