范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

集合源码解析StackandQueue精讲初中级人员

  前言
  集合的重要程度很高 如果不能全面了解 就没法完全发挥它的作用 打好地基才能走得远  Stack & Queue概述
  Java里有一个叫做  Stack  的类,却没有叫做  Queue  的类(  它是个接口名字  )。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList  )。Queue
  Queue  接口继承自Collection接口  ,除了最基本的Collection的方法之外,它还支持额外的  *insertion*, *extraction*和*inspection*操作  。这里有两组格式,共6个方法,一组是抛出异常的实现;另外一组是返回值的实现(没有则返回null)。
  Throws exception
  Returns special value
  Insert
  add(e)
  offer(e)
  Remove
  remove()
  poll()
  Examine
  element()
  peek()  Deque
  Deque  是"double ended queue", 表示双向的队列,英文读作"deck". Deque 继承自 Queue接口,除了支持Queue的方法之外,还支持insert  , remove  和examine  操作,由于Deque是双向的,所以可以对队列的头和尾都进行操作,它同时也支持两组格式,一组是抛出异常的实现;另外一组是返回值的实现(没有则返回null)。共12个方法如下:
  First Element - Head
  Last Element - Tail
  Throws exception
  Special value
  Throws exception
  Special value
  Insert
  addFirst(e)
  offerFirst(e)
  addLast(e)
  offerLast(e)
  Remove
  removeFirst()
  pollFirst()
  removeLast()
  pollLast()
  Examine
  getFirst()
  peekFirst()
  getLast()
  peekLast()
  当把  Deque  当做FIFO的queue  来使用时,元素是从deque  的尾部添加,从头部进行删除的; 所以deque  的部分方法是和queue  是等同的。具体如下:
  Queue Method
  Equivalent Deque Method
  add(e)
  addLast(e)
  offer(e)
  offerLast(e)
  remove()
  removeFirst()
  poll()
  pollFirst()
  element()
  getFirst()
  peek()
  peekFirst()
  Deque  的含义是"double ended queue",即双端队列  ,  它既可以当作栈使用,也可以当作队列使用  。下表列出了  Deque  与  Queue  相对应的接口:
  Queue Method
  Equivalent Deque Method
  说明
  add(e)
  addLast(e)
  向队尾插入元素,失败则抛出异常
  offer(e)
  offerLast(e)
  向队尾插入元素,失败则返回  false
  remove()
  removeFirst()
  获取并删除队首元素,失败则抛出异常
  poll()
  pollFirst()
  获取并删除队首元素,失败则返回  null
  element()
  getFirst()
  获取但不删除队首元素,失败则抛出异常
  peek()
  peekFirst()
  获取但不删除队首元素,失败则返回  null
  下表列出了  Deque  与  Stack  对应的接口:
  Stack Method
  Equivalent Deque Method
  说明
  push(e)
  addFirst(e)
  向栈顶插入元素,失败则抛出异常
  无
  offerFirst(e)
  向栈顶插入元素,失败则返回  false
  pop()
  removeFirst()
  获取并删除栈顶元素,失败则抛出异常
  无
  pollFirst()
  获取并删除栈顶元素,失败则返回  null
  peek()
  getFirst()
  获取但不删除栈顶元素,失败则抛出异常
  无
  peekFirst()
  获取但不删除栈顶元素,失败则返回  null
  上面两个表共定义了  Deque  的12个接口。添加,删除,取值都有两套接口,它们功能相同,区别是对失败情况的处理不同。  一套接口遇到失败就会抛出异常,另一套遇到失败会返回特殊值(  false  或null  ) 。除非某种实现对容量有限制,大多数情况下,添加操作是不会失败的。虽然Deque的接口有12个之多,但无非就是对容器的两端进行操作,或添加,或删除,或查看**。明白了这一点讲解起来就会非常简单。
  ArrayDeque和LinkedList  是  Deque  的两个通用实现  ,由于官方更推荐使用  AarryDeque  用作栈和队列,这个文章主要整理  ArrayDeque  **的具体实现。
  从名字可以看出  ArrayDeque  底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即  循环数组(circular array)   ,也就是说数组的任何一点都可能被看作起点或者终点。  ArrayDeque  是非线程安全的(not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入  null  元素。
  上图中我们看到,  head  指向首端第一个有效元素,tail  指向尾端第一个可以插入元素的空位。因为是循环数组,所以head  不一定总等于0,tail  也不一定总是比head  大。方法剖析addFirst()
  addFirst(E e)  的作用是在Deque的首端插入元素,也就是在head  的前面插入元素,在空间足够且下标没有越界的情况下,只需要将elements[--head] = e  即可。
  实际需要考虑: 1.空间是否够用,以及2.下标是否越界的问题。上图中,如果  head  为0  之后接着调用addFirst()  ,虽然空余空间还够用,但head  为-1  ,下标越界了。下列代码很好的解决了这两个问题。//addFirst(E e) 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();//扩容 }
  上述代码我们看到,  空间问题是在插入之后解决的  ,因为  tail  总是指向下一个可插入的空位,也就意味着elements  数组至少有一个空位,所以插入元素的时候不用考虑空间问题。
  下标越界的处理解决起来非常简单,  head = (head - 1) & (elements.length - 1)  就可以了,这段代码相当于取余,同时解决了head  为负值的情况。因为elements.length  必需是2  的指数倍,elements - 1  就是二进制低位全1  ,跟head - 1  相与之后就起到了取模的作用,如果head - 1  为负数(其实只可能是-1),则相当于对其取相对于elements.length  的补码。
  下面再说说扩容函数  doubleCapacity()  ,其逻辑是申请一个更大的数组(原数组的两倍),然后将原数组复制过去。过程如下图所示:
  图中我们看到,复制分两次进行,第一次复制  head  右边的元素,第二次复制head  左边的元素。//doubleCapacity() 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];     System.arraycopy(elements, p, a, 0, r);//复制右半部分,对应上图中绿色部分     System.arraycopy(elements, 0, a, r, p);//复制左半部分,对应上图中灰色部分     elements = (E[])a;     head = 0;     tail = n; }  addLast()
  addLast(E e)  的作用是在Deque的尾端插入元素,也就是在tail  的位置插入元素,由于tail  总是指向下一个可以插入的空位,因此只需要elements[tail] = e;  即可。插入完成后再检查空间,如果空间已经用光,则调用doubleCapacity()  进行扩容。
  public void addLast(E e) {     if (e == null)//不允许放入null         throw new NullPointerException();     elements[tail] = e;//赋值     if ( (tail = (tail + 1) & (elements.length - 1)) == head)//下标越界处理         doubleCapacity();//扩容 }
  下标越界处理方式  addFirt()  中已经讲过,不再赘述。pollFirst()
  pollFirst()  的作用是删除并返回Deque首端元素,也即是head  位置处的元素。如果容器不空,只需要直接返回elements[head]  即可,当然还需要处理下标的问题。由于ArrayDeque  中不允许放入null  ,当elements[head] == null  时,意味着容器为空。public E pollFirst() {     E result = elements[head];     if (result == null)//null值意味着deque为空         return null;     elements[h] = null;//let GC work     head = (head + 1) & (elements.length - 1);//下标越界处理     return result; }  pollLast()
  pollLast()  的作用是删除并返回Deque尾端元素,也即是tail  位置前面的那个元素。public E pollLast() {     int t = (tail - 1) & (elements.length - 1);//tail的上一个位置是最后一个元素     E result = elements[t];     if (result == null)//null值意味着deque为空         return null;     elements[t] = null;//let GC work     tail = t;     return result; }  peekFirst()
  peekFirst()  的作用是返回但不删除Deque首端元素,也即是head  位置处的元素,直接返回elements[head]  即可。public E peekFirst() {     return elements[head]; // elements[head] is null if deque empty }  peekLast()
  peekLast()  的作用是返回但不删除Deque尾端元素,也即是tail  位置前面的那个元素。public E peekLast() {     return elements[(tail - 1) & (elements.length - 1)]; }

作文在线(初三一模)那个值得记住的日子一曲赛马,时而欢腾热烈,时而舒畅悠扬,琴弓微让,乐音渐落,台下的观众才恍若梦醒,掌声经久不息。台上的我,早已热泪盈眶,那藏在乐章里说不尽的暗语像是潺潺流淌的山涧溪流一般,冲洗着我在老照片接母亲来北京,不留遗憾图1拍摄于1964年,是我和父亲弟弟的合影。我老家在重庆,弟弟1958年出生。弟弟出生后不久,迎来了困难时期。因为营养少抵抗力低,他身上浮肿,大腿一按一个印,白天晚上哭。母亲寻找偏英伦顶级数码媒体T3年度奖项公布,快来看看有什么耳机入围本内容由影音智媒体原创发布。观点仅代表作者本人作者老海龟T3Awards2022作为数码圈的奥斯卡奖,它的公布无疑是一枚重磅炸弹。上一期老海已经写了一篇T3大奖的文章,但由于时间问乳母只负责给孩子喂奶?乳母发挥着重要的角色!经常看清宫剧的观众都知道奶妈。在大家的印象中,护士似乎只是一个提供母乳的女人。但是,对于一个吃奶的孩子来说,奶妈的重要性远不止于此。保姆是封建思想的产物,尤其是在皇宫里,有大量的保新东方在线拟更名东方甄选直播带货成功开启新篇章?南都讯记者李梓毅1月5日,新东方在线(HK01797)发布公告称,新东方在线董事会建议将公司中文名新东方在线科技控股有限公司更改为东方甄选控股有限公司英文名称由KoolearnTe2022年最值得玩的10款独立游戏!充满个性特色十足文芷穆老师如今的游戏市场,每年都有许多厂商不断绞尽脑汁,开发自己的3A大作斗个你死我活,但是也有一些小型独立工作室,选择走自己的路,打造出一些规模虽小却也别具特色的作品,成为市场上王者荣耀世冠杯KIC深圳收官,武汉eStarPro八连冠南都讯记者陈紫嫣12月30日,2022年王者荣耀世界冠军杯KIC总决赛在深圳湾体育中心春茧体育馆顺利落幕,来自KPL赛区的武汉eStarPro42击败对手,夺得全新的金凤凰杯及35幻塔易手游买号9。1Wgs超多满星武器,各位觉得值不值?今天小易为大家更新的是幻塔完美通行证星岛2服的玩家账号测评,不多废话,赶紧来看看吧!账号来自易手游,swcbg。com从主页图上可以看到目前等级是80级,已经到游戏等级上限了,可以详解版本神装时光之杖,一个改动助力卡萨丁登顶中单排行榜!S13季前赛已经更新有一段时间了,和往年一样,季前赛版本依然是各位峡谷发明家们施展才华的舞台,这段时间流行的心之钢联盟贾修联盟等等想必大家也都领会过了,许多英雄都在季前赛版本获得了什么人玩什么鸟?结合召唤兽,聊一聊对最终幻想16七个猜想引言作为最终幻想系列的标志性特色,召唤兽将在新作中起到至关重要的作用。从首次公开到确定发售日,最终幻想16(下文简称FF16)一改前作拖拖拉拉的便秘症状,在吉田直树的主持下,先后四14分20板5助!联盟第一!勇士2250万果然赌对了,三冠王实至名归NBA联盟之中,总是会有一些不起眼的角色球员,突然爆发出洪荒之力,关键时刻完成绝杀,成为赢球的最大功臣。如何判断一名角色球员的大心脏实力?最好就是看他的打球态度,态度决定一切,这并
因未告知消费者出售其个人信息,丝芙兰被罚120万美元近日,美国加利福尼亚州(下称加州)总检察长罗伯邦塔(RobBonta)在发布会上表示,著名化妆品品牌丝芙兰(SEPHORA)就其侵犯消费者隐私一事与加州居民达成和解协议,决定支付1首儿所党委书记刘中勋凝聚所有资源守护孩子健康,是党交给首儿所的任务本报记者孟庆伟北京报道党的十八大以来,党和国家对儿童健康工作的发展建设给予了极大关注和支持。守护保障好儿童的生命安全和身体健康,让每个孩子茁壮成长,关乎祖国和民族的未来。近十年来,菏泽市自然资源和规划局亮职责解政策办实事展形象专访活动2022年第6期为进一步加大自然资源和规划政策宣传力度,菏泽市自然资源和规划局联合市广播电视台组织开展了亮职责解政策办实事展形象专访活动,定期采访一名科室(单位)主要负责同志,公开科室三定职责解读今日油价9月4日汽油与柴油价格列表油价将在2天后,9月6日晚调整,经过最近八个工作日的统计,油价上涨247元吨(0。19元升0。22元升),下周二晚油价上涨恐怕已成定局,需要加油的小伙伴趁着今天休息日,赶快去加油吧手机号实名信息查询,是普通人防电信诈骗的工具当前在我国每天都有电信诈骗在发生,给老百姓造了巨大损失。根据国家反诈中心数据,2021年电信诈骗止付涉案资金3200余亿元2021年警方共破获电信网络诈骗案件37万余起。对于电信诈新型光电探测器能模仿光合作用新型光电探测器能模仿光合作用在超长距离实现光到电流的转换科技日报讯(记者张梦然)美国密歇根大学研究人员在光学期刊发表论文称,他们使用被称为极化子的独特准粒子开发了一种新型高效光电探国际最新研究早期哺乳动物生长速度快寿命短来源中国新闻网中新网北京9月1日电(记者孙自法)国际著名学术期刊自然最新发表一项古生物学研究指出,恐龙时代后最早的大型哺乳动物,生长速度比现代同体型的哺乳动物快一倍,寿命相对更短。在淘宝或拼多多上购物,记得关闭这个功能,防止购买隐私的泄露问大家一个问题,现在你是在网上买东西多,还是在实体店买东西多?相信应该很多朋友会回答在网上。那没错,现在网购的群体越来越大了,就连我妈学会了拼多多购物后,也是经常在网上买东西。但是驶入快车道,中国新能源汽车如何跑出加速度?(经济观察)驶入快车道,中国新能源汽车如何跑出加速度?中新社北京8月28日电题驶入快车道,中国新能源汽车如何跑出加速度?作者刘文文曹旭帆中国新能源汽车产业驶入快车道。截至2021年热力学四大定律发展史18世纪,卡诺等科学家发现在诸如机车人体太阳系和宇宙等系统中,从能量转变成功的四大定律。没有这四大定律的知识,很多工程技术和发明就不会诞生。热力学的四大定律简述如下热力学第零定律如八大造车新势力车企销量出炉,第一名又换人了!随着各大车企在新能源汽车市场不断发力,以往蔚小理哪称霸车市的日子已经渐去渐远了。从8月份的销量数据看,哪吒汽车依然势头强劲,但抵不过广汽埃安的全力追击,冠军的名头已经花落别家蔚来在