首页 > 编程语言 >ArrayDeque源码解读

ArrayDeque源码解读

时间:2024-08-22 16:14:56浏览次数:5  
标签:head ArrayDeque int 解读 tail 源码 null elements

ArrayDeque

ArrayDeque和LinkedList是Deque的两个通用实现,在使用Queue时,由于Queue只是一个接口,因此创建Queue时也会使用ArrayDeque

为了实现在数组两端进行操作元素的需求,因此ArrayDeque使用循环数组作为底层数据结构,同时,ArrayDeque中定义了head和tail两个指针指向头和尾

因为是循环数组,所以head可能比tail大,head指向第一个有效元素,tail指向尾部第一个可以插入元素的空位。

插入元素

因为是循环数组,扩容比较棘手,因此扩容操作是在插入操作完成之后进行的。

tail永远执行一个空位置,所以插入操作永远是有空余位置的。

下标越界直接取余就行。

public void addFirst(E e) {
    if (e == null)//不允许放入null
        throw new NullPointerException();
    elements[head = (head - 1) & (elements.length - 1)] = e;//2.下标是否越界
    if (head == tail)//1.空间是否够用
        doubleCapacity();//扩容
}

扩容操作

扩容操作的逻辑是申请一个更大的数组(两倍),然后使用System.arraycopy进行数据拷贝,拷贝的时候拷贝到新数组的头部。

private void doubleCapacity() {
    assert head == tail;
    int p = head;
    int n = elements.length;
    int r = n - p; // head右边元素的个数
    int newCapacity = n << 1;//原空间的2倍
    if (newCapacity < 0)
        throw new IllegalStateException("Sorry, deque too big");
    Object[] a = new Object[newCapacity];
    //第一次复制head右边的元素
    System.arraycopy(elements, p, a, 0, r);
    //第二次复制head左边的元素
    System.arraycopy(elements, 0, a, r, p);
    elements = (E[])a;
    head = 0;
    tail = n;
}

删除操作

删除只需要挪动下标,然后原来位置置null(方便GC回收)

public E pollFirst() {
    int h = head;
    E result = elements[head];
    if (result == null)
        return null;
    elements[h] = null;//方便GC回收
    head = (head + 1) & (elements.length - 1);//下标越界处理
    return result;
}

快速失败

ArrayDeque不是快速失败的集合,也不是安全失败的集合

ArrayDeque的迭代器是弱一致性的,不是快速失败的。它允许在迭代期间对集合进行修改而不会抛出异常,但这种修改可能不会被迭代器所反映出来。

快速失败和安全失败的区别

快速失败:使用modCount记录结构版本,发现接口修改直接抛出ConcurrentModificationException

安全失败:创建快照副本,保证迭代器迭代的时候不会受到结构修改的影响。

标签:head,ArrayDeque,int,解读,tail,源码,null,elements
From: https://www.cnblogs.com/lilizzyy/p/18374131

相关文章

  • java+vue计算机毕设旅游景点预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展,人们对旅游体验的需求日益个性化与高效化。传统的旅游预订方式往往存在信息不对称、购票流程繁琐、景点拥堵等问题,影响了游客的......
  • java+vue计算机毕设开放实验室网上预约系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育体系的不断发展和教育资源的日益丰富,实验室作为培养学生实践能力和创新精神的重要场所,其使用效率与管理水平成为衡量高校教学质量的重要......
  • java+vue计算机毕设农资电子监管系统的设计与实现【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农业现代化的不断推进,农资产品的流通与管理成为保障农业生产高效、安全的重要环节。传统农资管理模式存在信息不对称、监管难度大、效率低下等问......
  • Spring Cloud LoadBalancer 源码解析
    前言LoadBalancer(负载均衡器):一种网络设备或软件机制,用于分发传入的网络流量负载到多个后端目标服务器上,依次来提高系统的可用性和性能,SpringCloud2020版本以后,移除了对Netflix的依赖,也就移除了负载均衡器Ribbon,SpringCloud官方推荐使用Loadbalancer替换Ribbon,并......
  • 基于spring boot的幼儿园管理系统的设计与实现:幼儿园管理系统(源码+文档)
    目录一.研究内容和目的二.开发工具三.开发框架介绍四.系统需求分析五.幼儿园管理系统结构设计六.数据库设计七,系统页面展示八.源码获取一.研究内容和目的研究内容:本文基于SpringBoot框架设计和实现幼儿园管理系统,主要包括以下内容:幼儿园管理系统需求分析对幼儿园......
  • JSP基于JSP的二手车交易管理系统40fjs--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,卖家,车辆类型,车辆信息,预定信息,取消信息,反馈信息技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主......
  • JSP基于SSM的小型企业物料采购系统w92xq程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:员工,物料信息,物料登记,采购申请,物料置办,采购反馈,物料出库,采购员,供应商开题报告内容一、项目背景与意义在当前竞争激烈的市场环境下,小型企业面......
  • JSP基于ssm的志愿者管理系统dh67e(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着社会公益事业的蓬勃发展,志愿者活动日益频繁,传统的手工管理模式已难以满足高效、精准的管理需求。因此,开发一套基于SSM(Sprin......
  • 免授权Thinkphp彩虹易支付源码(USDT插件/当面付/通道轮询/搭建下载)
    彩虹易支付源码应运而生,旨在为企业和商户提供一款高效、安全、个性化的移动支付解决方案。本文将从代码设计者的角度,详细介绍彩虹易支付源码的开发背景、需求分析、技术架构、功能模块、示例代码以及开发流程。源码:fakaysw.top一、开发背景移动支付市场的兴......
  • (附源码)NodeJS农产品在线交易平台-计算机毕设 01124
     NodeJS农产品在线交易平台目 录摘 要1绪论1.1研究背景1.2研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 ......