应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

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

5月1日 皇极城投稿
  前言
  集合的重要程度很高如果不能全面了解就没法完全发挥它的作用打好地基才能走得远StackQueue概述
  Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayD既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。Queue
  Queue接口继承自Collection接口,除了最基本的Collection的方法之外,它还支持额外的insertion,extraction和inspection操作。这里有两组格式,共6个方法,一组是抛出异常的实现;另外一组是返回值的实现(没有则返回null)。
  Throwsexception
  Returnsspecialvalue
  Insert
  add(e)
  offer(e)
  Remove
  remove()
  poll()
  Examine
  element()
  peek()Deque
  Deque是doubleendedqueue,表示双向的队列,英文读作deck。Deque继承自Queue接口,除了支持Queue的方法之外,还支持insert,remove和examine操作,由于Deque是双向的,所以可以对队列的头和尾都进行操作,它同时也支持两组格式,一组是抛出异常的实现;另外一组是返回值的实现(没有则返回null)。共12个方法如下:
  FirstElementHead
  LastElementTail
  Throwsexception
  Specialvalue
  Throwsexception
  Specialvalue
  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是等同的。具体如下:
  QueueMethod
  EquivalentDequeMethod
  add(e)
  addLast(e)
  offer(e)
  offerLast(e)
  remove()
  removeFirst()
  poll()
  pollFirst()
  element()
  getFirst()
  peek()
  peekFirst()
  Deque的含义是doubleendedqueue,即双端队列,它既可以当作栈使用,也可以当作队列使用。下表列出了Deque与Queue相对应的接口:
  QueueMethod
  EquivalentDequeMethod
  说明
  add(e)
  addLast(e)
  向队尾插入元素,失败则抛出异常
  offer(e)
  offerLast(e)
  向队尾插入元素,失败则返回false
  remove()
  removeFirst()
  获取并删除队首元素,失败则抛出异常
  poll()
  pollFirst()
  获取并删除队首元素,失败则返回null
  element()
  getFirst()
  获取但不删除队首元素,失败则抛出异常
  peek()
  peekFirst()
  获取但不删除队首元素,失败则返回null
  下表列出了Deque与Stack对应的接口:
  StackMethod
  EquivalentDequeMethod
  说明
  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底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即循环数组(circulararray),也就是说数组的任何一点都可能被看作起点或者终点。ArrayDeque是非线程安全的(notthreadsafe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入null元素。
  上图中我们看到,head指向首端第一个有效元素,tail指向尾端第一个可以插入元素的空位。因为是循环数组,所以head不一定总等于0,tail也不一定总是比head大。方法剖析addFirst()
  addFirst(Ee)的作用是在Deque的首端插入元素,也就是在head的前面插入元素,在空间足够且下标没有越界的情况下,只需要将elements〔head〕e即可。
  实际需要考虑:1。空间是否够用,以及2。下标是否越界的问题。上图中,如果head为0之后接着调用addFirst(),虽然空余空间还够用,但head为1,下标越界了。下列代码很好的解决了这两个问题。addFirst(Ee)publicvoidaddFirst(Ee){if(enull)不允许放入nullthrownewNullPointerException();elements〔head(head1)(elements。length1)〕e;2。下标是否越界if(headtail)1。空间是否够用doubleCapacity();扩容}
  上述代码我们看到,空间问题是在插入之后解决的,因为tail总是指向下一个可插入的空位,也就意味着elements数组至少有一个空位,所以插入元素的时候不用考虑空间问题。
  下标越界的处理解决起来非常简单,head(head1)(elements。length1)就可以了,这段代码相当于取余,同时解决了head为负值的情况。因为elements。length必需是2的指数倍,elements1就是二进制低位全1,跟head1相与之后就起到了取模的作用,如果head1为负数(其实只可能是1),则相当于对其取相对于elements。length的补码。
  下面再说说扩容函数doubleCapacity(),其逻辑是申请一个更大的数组(原数组的两倍),然后将原数组复制过去。过程如下图所示:
  图中我们看到,复制分两次进行,第一次复制head右边的元素,第二次复制head左边的元素。doubleCapacity()privatevoiddoubleCapacity(){intnelements。head右边元素的个数intnewCapacityn1;原空间的2倍if(newCapacity0)thrownewIllegalStateException(Sorry,dequetoobig);Object〔〕anewObject〔newCapacity〕;System。arraycopy(elements,p,a,0,r);复制右半部分,对应上图中绿色部分System。arraycopy(elements,0,a,r,p);复制左半部分,对应上图中灰色部分elements(E〔〕)a;head0;}addLast()
  addLast(Ee)的作用是在Deque的尾端插入元素,也就是在tail的位置插入元素,由于tail总是指向下一个可以插入的空位,因此只需要elements〔tail〕e;即可。插入完成后再检查空间,如果空间已经用光,则调用doubleCapacity()进行扩容。
  publicvoidaddLast(Ee){if(enull)不允许放入nullthrownewNullPointerException();elements〔tail〕e;赋值if((tail(tail1)(elements。length1))head)下标越界处理doubleCapacity();扩容}
  下标越界处理方式addFirt()中已经讲过,不再赘述。pollFirst()
  pollFirst()的作用是删除并返回Deque首端元素,也即是head位置处的元素。如果容器不空,只需要直接返回elements〔head〕即可,当然还需要处理下标的问题。由于ArrayDeque中不允许放入null,当elements〔head〕null时,意味着容器为空。publicEpollFirst(){Eresultelements〔head〕;if(resultnull)null值意味着deque为空elements〔h〕letGCworkhead(head1)(elements。length1);下标越界处理}pollLast()
  pollLast()的作用是删除并返回Deque尾端元素,也即是tail位置前面的那个元素。publicEpollLast(){intt(tail1)(elements。length1);tail的上一个位置是最后一个元素Eresultelements〔t〕;if(resultnull)null值意味着deque为空elements〔t〕letGC}peekFirst()
  peekFirst()的作用是返回但不删除Deque首端元素,也即是head位置处的元素,直接返回elements〔head〕即可。publicEpeekFirst(){returnelements〔head〕;elements〔head〕isnullifdequeempty}peekLast()
  peekLast()的作用是返回但不删除Deque尾端元素,也即是tail位置前面的那个元素。publicEpeekLast(){returnelements〔(tail1)(elements。length1)〕;}
投诉 评论

集合源码解析StackandQueue精讲初中级人员前言集合的重要程度很高如果不能全面了解就没法完全发挥它的作用打好地基才能走得远StackQueue概述Java里有一个叫做Stack的类,却没有叫做Queue的类(……高躰亲子时光秋季长个的三大运动进入秋天,气温逐渐凉爽起来,在这样的季节里就特别适合带孩子进行户外运动。科学适当的体育运动不但可以增强孩子的抵抗力,对身高增长也是非常有帮助的。研究表明,经常运动的孩子要比不爱……从iPhone13到一加AcePro,聊聊我的梦中情机标准前言:去年的这个时候,我入手了iPhone13,本以为它可以作为我的主力手机,不料到手后的体验着实有些失望。今年4月我又入手了一加10Pro,结果又遇到了新的烦恼。今年9……买手机不一定要选最新最贵的,这三款性价比手机,很适合打工的人今天我们合大家聊三款性价比手机,非常适合打工人入手。对于月光族来说,手机不一定非要买最新最贵的,适合才是王道。vivoS12从配置方面来看,vivoS12搭载天玑1……瞭望解码昆明之变昆明要当好云南经济社会发展排头兵,重点在经济发展,关键靠产业支撑。昆明正坚持共抓大保护、不搞大开发,按照打造滇池沿岸大生态、大湿地、大景区的要求,推动生态、文化、农业、旅……智慧友爱勇敢善良哪一个才是童话故事的价值基底?又到了凯奖绘本评论专栏时间了!这个专栏由儿童文学、性别与当代文学文化研究者王帅乃执笔,逐一梳理和点评已有中文版的凯迪克金奖绘本,看看一本图画书除了功能性,还可以从哪些角度赏析,……王艺迪和陈幸同本届世锦赛一直坐板凳的原因成都世锦赛四强已经产生,中国女子乒乓球队如愿以偿,打进四强,恭喜中国队的同时,球迷们发现王艺迪和陈幸同没有像以前国乒团体赛一样,取得上场的会,以前国乒团体赛都会让新人打一打,而……市场调查公司长江储存可能被迫退出3DNAND美国加大对中国国内闪存供应商长江存储的贸易限制。(芯团网是国内仅有的专业型芯片元器件纯第三方交易平台,银行管资金,一分钟货比百家、质量有保证)基于分析师和研究人员对美国商……国家能源博兴2X1000MW新建项目开工滨州日报滨州网讯9月27日上午,在博兴县纯化镇,国家能源博兴2X1000MW新建项目正式破土开工。据了解,该项目规划建设2台1000MW火电机组,采用目前世界最先进的超超……李宁为什么要创造一个新品牌LINING19902021年11月4日,李宁(中国)体育用品有限公司(以下简称李宁)正式发布全新独立高级运动时尚品牌LINING1990(李宁1990)。和安踏、特步等企业频繁收购、大力发……叠穿,让秋天更时髦秋天的到来仿佛是一夜间的事,相信大家的衣橱早已备好了各式各样的基础款单品,如时髦风衣、浪漫针织开衫,和飘逸的裙子以及气质迷人的衬衫,只要这些单品组合得当就能助你轻松应对换季,让……有时间,去台湾走走吧我若干年前去过一次台湾,真的觉得台湾是一个非常值得一游的地方。我在台湾呆了十天左右,走了半个台湾。冬季的台湾不冷,气候宜人,但淫雨霏霏。从台北出发,驱车一路向东,便来到了……
阿凡达23大海兽资料《阿凡达2水之道》半只猫已经看了,这一次你将进入卡梅隆为你创造的另一片天地。《阿凡达2水之道》场景,真美有三种海洋生物在电影中会高频地出现:图鲲Tulkun、伊鲁I……5G工业互联网赋能江西制造走向江西智造图为位于江西省南昌市青山湖区的华兴针织实业有限公司,员工在生产。(资料图)刘孜婧摄【新时代新征程新伟业】5G工业互联网赋能江西制造走向江西智造中新网南昌12月30日……国家药监局布洛芬和对乙酰氨基酚原料药产能充足视频加载中。。。(央视财经《正点财经》)针对近期退烧类药物需求量激增的情况,国家药监局负责人介绍,目前相关药品原料充足,正在加快释放产能。针对社会关注的解热镇痛类常……加拿大8月份国内生产总值微升中新网多伦多10月28日电据加拿大统计局10月28日发布的数据,今年8月加拿大实际国内生产总值(GDP)较上月微升0。1,与7月份的环比增幅持平。服务生产行业实现约0。3……从玩具枪到10米气步枪张雨父亲口述女儿夺冠之路图为张雨在进行射击训练。张明军摄中新网郑州10月18日电题:从玩具枪到10米气步枪张雨父亲口述女儿夺冠之路作者程航在埃及开罗持续举行的2022年国际射联射击(……全球连线全球重要农业文化遗产太行梯田喜迎丰收季视频加载中。。。秋意渐浓,在河北涉县太行梯田上,花椒、玉米、谷子等农作物迎来丰收。涉县旱作石堰梯田系统为雨养农业系统,历史可追溯至13世纪。2022年5月,该梯田系统被列……全锦赛团体赛结束,周恺31战胜周启豪,上海队夺冠众所周知,最近全国锦标赛正在激烈进行中。眼下团体赛的决赛已经告一段落,随着决赛落下帷幕之后,最终男团方面由樊振东带领的上海队险胜林高远带领的广东队,夺得本次团体冠军。在这……姐,再折腾就要被全网黑了吧?提名辣目洋子为2022年度口碑滑坡十大艺人,没人反对吧?哦不,从现在开始应该叫李嘉琦了。好好地突然改名,抛掉已经积攒下认知度的艺名,有不少人正奇怪呢编剧汪海林……外媒苹果求生欲很强苹果的iPhone14如期发布了,尽管连创始人乔布斯的女儿都吐槽毫无新意,但依然不影响人家的热销,预售一开始还是遭到了哄抢,甚至有反应连苹果的官网都崩了。即使发货时间需要……麦旋风杀人事件?人工制品对自然的影响有多大?打开眼界演化陷阱?还是人为事故?受到塑料垃圾的影响,许多鸟类窒息而亡。图nationalgeographic提到影响自然的人工制品你会想到什么?被渔网缠……范志毅预言破灭!中国U19队拒绝冷门,补时造两点球31缅甸队北京时间9月11日凌晨,u20亚洲杯预选赛打响,中国U19队首场对手是缅甸U19队,这是一场让人关注的较量。中国队能否击碎范志毅魔咒让人关注,最终中国队没有让全国球迷失望,也让……带你扒一扒伊丽莎白在中国有多少产业文IPO研究院透市君昨天,96岁的英国女王伊丽莎白亚历山德拉玛丽温莎。在日不落帝国日趋衰落的时候,一个人和她的时代落幕了。但是,没有结束的是,在中国内地,扛着伊丽莎白旗号……
友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找