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也结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 SVG:开启向量图形的大门(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

SQL注入漏洞的漏洞挖掘与利用

预计更新SQL注入概述 1.1 SQL注入攻击概述 1.2 SQL注入漏洞分类 1.3 SQL注入攻击的危害 SQLMap介绍 2.1 SQLMap简介 2.2 SQLMap安装与配置 2.3 SQLMap基本用法 SQLMap进阶使用 3.1 SQLMap高级用法 3.2 SQLMap配置文件详解 3.3 SQLMap插件的使用 SQL注入漏洞检测 4.1 SQL注入…

acwing算法提高之动态规划--背包模型(四)

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;货币系统。 解题思路&#xff1a;完全背包模型求方案数。 状态定义f[i][j]&#xff1a;从前i个物品中选体积恰好为j的方案数。 状态转移f[i][j]&#xff0c;以下情况…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

【C语言程序设计】循环结构程序设计

目录 前言 一、程序设计第一题 二、程序设计第二题 三、程序设计第三题 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da…

Ubuntu 22.04 安装 OCI CLI

Ubuntu 22.04 安装 OCI CLI 安装命令 安装命令 wget https://codeload.github.com/oracle/oci-cli/zip/master -O oci-cli.zip pip install oci-cli.zip完结&#xff01;

Armv8/Armv9从入门到精通-课程介绍

通知&#xff0c;Arm二期&#xff0c;咱们也有大合集PDF了&#xff0c;共计1587页&#xff0c;还未完成&#xff0c;后续持续更新和优化中。为了方便大家阅读、探讨、做笔记&#xff0c;特意整了此合集PPT&#xff0c;为了增加标签目录&#xff0c;还特意开了福兮阅读器会员。 …

宇视科技视频监控 main-cgi 文件信息泄露漏洞

宇视科技视频监控 main-cgi 文件信息泄露漏洞 一、产品简介二、漏概述三、复现环境四、漏洞检测手工抓包自动化检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

java实现局域网内视频投屏播放(一)背景/需求

一 背景 我们在用电视上投屏电影或者电视剧时&#xff0c;如果没有vip&#xff0c;用盗版电影网站投屏的话会有两个问题&#xff0c;1:他们网站没有投屏功能。2:卡&#xff01;&#xff01;&#xff01;。还有就是不能随心所欲的设置自己先要自动播放的视频列表&#xff08;如…

防止root用户误删除指令

在CentOS 7或其他Linux系统中&#xff0c;防止root用户误删除关键文件或目录的一种常见做法是使用chattr命令设置文件的"i"属性&#xff0c;使其变为不可变。这将防止文件被删除、重命名、链接或更改其内容。 chattr i /path/to/your/file_or_directory例如&#xf…

【C++】输入输出流 ⑩ ( 文件流 | 文件流打开方式参数 | 文件指针 | 组合打开方式 | 文件打开失败 )

文章目录 一、文件流打开方式参数1、文件流打开方式参数2、文件指针3、组合打开方式4、文件打开失败 一、文件流打开方式参数 1、文件流打开方式参数 文件流打开方式参数 : ios::in : 以只读方式打开文件 ;ios::out : 以只写方式打开文件 , 默认打开方式 , 如果文件已存在则清…

PHP中什么是Composer?

Composer 是一个用于 PHP 项目依赖管理的工具。它允许你定义、安装和管理 PHP 项目所需的外部库和工具。Composer 是一个命令行工具&#xff0c;通过一个名为 composer.json 的配置文件来管理项目的依赖关系。 主要功能包括&#xff1a; 依赖管理&#xff1a; Composer 可以解…

【C语言程序设计】选择结构程序设计

目录 前言 一、程序阅读 二、程序改错 三、程序设计 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。Tomc…

19.java绘图

A.Graphics类 Graphics类是java.awt包中的一个类&#xff0c;它用于在图形用户界面&#xff08;GUI&#xff09;或其他图形应用程序中进行绘制。该类通常与Component的paint方法一起使用&#xff0c;以在组件上进行绘制操作。 一些Graphics类的常见用法和方法&#xff1a; 在组…

GEE机器学习——利用分类和回归树(Classification and Regression Trees,CART)土地分类分析

分类和回归树(Classification and Regression Trees,CART)方法 分类和回归树(Classification and Regression Trees,CART)是一种常用的机器学习算法,用于解决分类和回归问题。CART算法通过构建一棵决策树来对数据进行分类或回归预测。 CART方法的具体步骤如下: 1. 数…

Flask维护者:李辉

Flask维护者&#xff1a;李辉&#xff0c; 最近看b站的flask相关&#xff0c;发现了这个视频&#xff1a;[PyCon China 2023] 濒危 Flask 扩展拯救计划 - 李辉_哔哩哔哩_bilibili 李辉讲他在维护flask之余&#xff0c;开发了apiflask这个依托flask的框架。GitHub - apiflask/a…

如何通过 SSH 访问 VirtualBox 的虚机

VirtualBox 是一款免费虚机软件。在用户使用它安装了 linux 以后&#xff0c;它默认只提供了控制台的管理画面。 直接使用控制台管理 Linux 没有使用诸如 putty 或者 vscode 这样的 ssh 远程管理工具方便。那么可不可以直接使用 ssh 访问 VirtualBox 上的 Linux 呢&#xff1f…

Vue3按需引入element plus 以及icon

最近在自学Vue3&#xff0c;打算做一个纯前端的小东西&#xff0c;记录一下element-plus的安装和使用。以下是安装使用过程&#xff0c;以及踩过的坑。 一、安装element-plus及icon npm i element-plus element-plus/icons-vue -S 二、安装按需导入的插件 npm i unplugin-…

云计算在数据处理中的应用

云计算在数据处理中的应用 一、引言 随着数据规模的爆炸式增长&#xff0c;数据处理成为了一个巨大的挑战。云计算作为一种灵活、可扩展的计算模式&#xff0c;为数据处理提供了强大的支持。本文将探讨云计算在数据处理中的应用。 二、云计算与数据处理 云计算是一种将计算资…