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

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

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、路由模块添加前缀 四、中间件