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

集合源码解析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。是光光花有什么功效?光光花有什么功效?这是农村对于蜀葵的一种俗称,蜀葵在农村有很多种的名字,像一丈红棋盘花端午花等等诸多的名称,由于其生长习性极为粗放,几乎不用打理就能花繁叶茂,在农村庭院大门两侧极为高瓴的钱哪来的,一整天领投也没卖出股份,钱却那么多?高瓴资本是一家私募基金,它的钱除了来自创始人等股东外更大一部分是其他投资人给的。给大家简单举个例子。假如有一位在资本市场上摸爬滚打多年,永远一定人脉和名气的几个人决定从原先供职的大脑梗的人双腿无力是怎么回事?多久以后才能好?提到脑梗,大家可能会感到恐惧。脑梗后的并发症也是让人无法忽视的,脑梗塞是一种严重致残性疾患,进行积极的康复治疗,可使90的患者重新获得步行和自理生活的能力,其中300的患者还能恢复朋友向银行贷款50万,想从我公司过账,被我拒绝了。我做的对吗?这种情况现实中太过于常见了,之所以要从你的公司过账,最常见的有两种可能(1)银行要求贷款资金受托支付(受托支付就是银行直接把货款打给交易对手而不是申请人,如果款项打入申请人账户,再茶颜悦色疑薪资内乱,员工抱怨月薪3000元,高管在全员群内争论,200多员工退群,真实情况如何?只能说这管理和公关是真的菜,员工不爽你给得少那就私下解决,搞个大群还说攻击私人生活的话,这不是找死吗!至于什么企业担风险,企业是在疫情期间担了风险有损失,可你赚了也不会多给员工发钱支付宝欠款16个逾期了,说要上门,真的会上门吗?只要欠款的金额达到五千以上,上门是肯定会的,我堂妹欠款9000多,直接上门催款,堂妹不承认,他们直接报警震惊我对这个行业比较了解,我来给大家讲讲支付宝的催收流程,在这里全面讲解一下老干妈为什么坚持不贷款不融资不上市,这样对企业发展真的有好处吗?像小米雷军娃哈哈的宗庆后这些企业家,开始一直叫嚷着坚决不上市,但最终还是积极主动要求上市。而对于老干妈的企业来说,却始终坚持着一手交钱,一手交货的买卖原则和不贷款不融资不上市的信条一般情况下持仓几只股票是比较合理的?无数残酷的事实证明,持仓股票数量越多的股民,越不容易赚到钱,而满仓一只股票的股民,更容易踩雷。对于资金量20万以下的小散,建议持仓不要超过3只。对于资金量100万以下的普通股民,建工勤人员以后还有发展空间吗?自上世纪90年代和二十世纪初,国家明令禁止以工代干聘干,堵住了工人直接转干提拔的这一特殊通道后,工人身份的工勤人员就没有了晋升空间,再说前途已无从谈起。按照当下形势发展,不客气地说
再添劲旅223。1亿!湘江新区湘阴片区20个项目集中签约或开工红网时刻岳阳1月31日讯(记者胡峥通讯员蒋纪彭柳)人勤春来早,奋战开门红。1月31日,湖南湘江新区湘阴片区第六批产业项目集中签约暨中联新材总部装备制造基地和片区2023年一季度重点不甘于一辈子只做个交易员,他擅自设机构炒美股今晚九点半从事美股交易工作的周某不甘于一辈子只做个交易员在未经国家有关部门批准的情况下擅自开设交易室用于操作美股交易并在全国范围内发展起从事美股交易的交易室在投资公司工作的他不甘于一辈子只做新年首月5家支付机构被罚没1247万元,罚单金额数量同比回落,传递哪些信息?2023年首月,第三方支付领域的罚单并未缺席。2023年1月31日,北京商报记者根据央行各分支机构披露的信息统计发现,仅按发布时间计算,1月,央行总计对金运通网络支付股份有限公司(10后!2大连锁反应诞生国米有望成3冠王,穆帅夺冠难度大增北京时间2月1日凌晨,国米主场迎战亚特兰大,双方竞争一个意大利杯半决赛席位,结果国米10击败对手,顺利挺进半决赛。在此之前,那不勒斯和AC米兰都已经被淘汰,国米现在无疑是意大利杯夺林书豪4日抵台最快12日披钢铁人战袍首秀中新网2月1日电据台湾中央社报道,此前,美籍华裔篮球运动员林书豪宣布加盟台湾职业篮球联赛PlusLeague(PLG)联盟高雄钢铁人队。他今天(2月1日)在个人社交媒体宣布,预计2莫以不会当说辞干部就得干字当头,在实干中推动发展,巧干中化解难题,坚持干中创造飞跃。然而,面对目标任务,或者领导安排的工作,个别干部不想做,缺乏干的意愿不敢做,没有干的豪气不愿意做,缺乏干的担当青未了流淌在大地上的大地欢歌当赤橙黄绿青蓝紫的彩旗迎风招展,咚咚锵锵的锣鼓敲起,迎着震耳欲聋的爆竹声,耍社火的队伍浩浩荡荡行走在村庄里,每个人脸上洋溢着喜悦幸福的笑容,你可想象这是怎样一场盛大而隆重的仪式?耍一个人这么对你,不管是谁都要绝交,没有来往的必要性现实当中,成年人要明白一点那些伤害你的对你不好的人,都没有必要来往。你没必要,太委屈自己。而且有些人,即便你勉强自己交往下去,也会发现对方的恶意,一直都在。你即便委曲求全,也换不来该火了!这座一眼望三国的东北小城,去过一次就忘不了!吉林珲春素有森林之城的美誉,也是唯一一处中朝俄三国交界的城市。防川民俗村这里风光秀丽,森林浩瀚,还能领略朝鲜和俄罗斯的风貌。今天,浙游君就带大家走进美丽的珲春,揭开她神秘的面纱防川请来奉贤渔沥农场,看诗和远方的田野你知道在上海这座大都市中藏着多少田野吗?当春暖花开,你知道去哪里踏青吗?在全面推进乡村振兴的东风下,渔沥村抓住机会,结合农村受众和对象,打造了一系列具有农耕农趣农味充满正能量形式多过完年心更累!这5本书帮助我们放空心灵明明是想趁着过年,让身心休息一下。结果,整日忙碌于应酬交际,沉醉于觥筹交错。有的想趁着假期,来一场说走就走的旅行。但是,不是堵在路上,就是景点排队,有的城市更恐怖到吃个饭买杯奶茶都