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

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

  前言
  集合的重要程度很高如果不能全面了解就没法完全发挥它的作用打好地基才能走得远StackQueue概述
  Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然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(){assertheadtail;intphead;intnelements。length;intrnp;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;tailn;}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为空returnnull;elements〔h〕null;letGCworkhead(head1)(elements。length1);下标越界处理returnresult;}pollLast()
  pollLast()的作用是删除并返回Deque尾端元素,也即是tail位置前面的那个元素。publicEpollLast(){intt(tail1)(elements。length1);tail的上一个位置是最后一个元素Eresultelements〔t〕;if(resultnull)null值意味着deque为空returnnull;elements〔t〕null;letGCworktailt;returnresult;}peekFirst()
  peekFirst()的作用是返回但不删除Deque首端元素,也即是head位置处的元素,直接返回elements〔head〕即可。publicEpeekFirst(){returnelements〔head〕;elements〔head〕isnullifdequeempty}peekLast()
  peekLast()的作用是返回但不删除Deque尾端元素,也即是tail位置前面的那个元素。publicEpeekLast(){returnelements〔(tail1)(elements。length1)〕;}

iPhone14ProMax小米13双持!备用机iPhone以前,我是一手用着iPhone14ProMax,一手拿着iPhone11ProMax作为备用机。但是,这两款手机的重量都不轻。所以,很多时候出门,带着iPhone11Pr……聆听平山初四,阳光灿烂点击上方即可收听文章音频主播燕玲初四手记文魏风仙今冬的太阳真是大发慈悲就连任性的大风也有点手足无措了蓝天和白云那么干净大大愉悦了人们过……专家日记专家日记1hr我的书桌上放着两台电脑,一台是联想,另一台也是联想,第一台联想打开的网址是知网,第二台打开的也是知网。稿纸上写着两句打油诗,横眉冷对知网站,俯首半年无进展。……苹果microLED制造专利曝光,未来将装备在iPhone和IT之家1月20日消息,根据美国商标和专利局(USPTO)今天公示的专利清单,苹果于本周三获得了一项非常有技术含量的microLED屏幕专利,涉及如何高效量产microLED屏……古人怎么给孩子取名字呢?看完这篇你就知道了广东省佛山市公安局日前公布佛山地区2021年新生儿取名热门:男孩取名为梓豪的最多,其次是梓轩、梓睿、宇轩;女孩取名为芷晴的最多,其次是梓晴、语桐、芊妤。梓字依然呈居高不下……在西双版纳偶遇缅甸的山货倒爷作为一名产业专家,首先要研究产品,把产品研究清楚了,产业也就明晰了,要深刻了解国内外产品销售的经历,特别是各种倒爷的赚钱过程,还是很有意思的。今天来到西双版纳,来到告庄,……我为你牺牲那么多,为什么你不珍惜?很多父母常常懊恼,明明很用心很努力在顾小孩,但为何亲子沟通越来越糟?小孩叛逆不听话,经常与父母唱反调,到底要怎么做才能让小孩明白父母的用心?其实很多问题,只要改变心态,一……科学家能通过引力透镜观测遥远星系,对方也同样在观测我们?在11月23日NASA分享了一张由哈勃太空望远镜拍到的特殊照片,在这张太空照片中呈现出多个引力透镜效应,这是一种由星系的引力扭曲光线后形成类似放大镜的光学影像,天文学家能通过这……不是穷!是这些真的很好用多芬磨砂膏,爱洗澡女孩一定不能错过的香香去角质神器,洗完身上一滴水都留不住花理堂洗发水,老油头女孩的天花板洗发水了,洗完发量看着就暴增,关键还止痒,感觉头上的螨虫都没了……10岁男孩长得矮,每天吃小米喝牛奶有用?做好2事或比吃药管用虽然现在生活水平高了,饮食也越来越健康,不过在这也会有一些问题出现。尤其是孩子的身高问题,俗话说爸矮矮一个,妈矮矮一窝。谁也不想自己的孩子长大之后,身高成为他自卑的一面。毕竟现……寻北京的泉水之甘池泉在北京的长沟镇曾经是名副其实的泉乡,有众多的泉水。据说在四个甘池村附近就有四大泉,有东甘池泉、北甘池泉、西甘池泉、还有宜新泉,而我只找到西甘池泉和北甘池泉,大概也就这两个泉还在……长期吃开水冲鸡蛋滴香油,对身体有好处吗?医生揭晓答案俗话说得好,早上要吃好,中午要吃饱,晚上要吃少,作为饮食铁律,很多人都把这一规律弄反了,尤其是对于一些上班族来说,在平时忙于工作,早上几乎很少有时间吃早饭,只是匆匆忙忙的对付一……
我国存款最安全的四大银行,你都知道哪个?看你存错地方了没有?大家好,我是清沐。对于中国人来说,存钱已经是一种刻在骨子里的习惯。尤其是对于老一辈的人来说,省吃俭用存钱是大大的安全感。随着社会的进步发展,出现了很多大大小小的银行,存钱……iOS16。1。1获果粉认可,苹果再不坑老机型了,iPhoniOS16。1。1正式版发布有几天了,很多人在讨论这个版本是否应该升级,今天给大家分享iPhoneXR升级iOS16。1。1正式版真实体验感受和升级建议,大家可以参考一下。……黄晓明现身看展中心,叶珂也在场,两人与同一人合影疑似一起出游11月10日晚间,有网友在社交平台中晒出一组在上海某看展中心与多位明星合影的照片,其中包括黄晓明、方文山等人,而且还有曾与黄晓明传绯闻的女友叶柯也在现场,照片一经发布,立刻引发……33岁巨婴仍穿纸尿裤,吃饭靠喂睡觉靠哄,智商正常却拒绝长大父母总是想给孩子最好地,尽其所能将有的一切都捧到孩子面前,孩子开心幸福,是父母的追求。中国自古觉得多子多福,添丁进口都是喜事,所以早期的中国家庭人口庞大,一个家庭很多子女……社保卡或数字人民币的载体,德生科技政务IT构筑新增长点(报告出品方分析师:太平洋证券曹佩程漫漫)1。民生综合服务商,业绩进入快速增长通道德生科技的战略定位为社保民生综合运营服务商。公司基于对社保卡是政府与百姓之间重要的……一个中成药,可以对付各种便秘,男女老少都能用便秘是由于大肠传导失职引起的,一般来说以下症状符合以下2项或2项以上,即为便秘:(1)排便费力;(2)排便为块状或硬便;(3)有排便不尽感;(4)有肛门……英超最新积分榜曼城输给利物浦遭首败,阿森纳客胜4分领跑昨晚今晨,英超联赛第11轮激战多场,利物浦主场10击败曼城,升至积分榜第8位,萨拉赫破门建功,曼城遭到首败;阿森纳客场10击败利兹联,4分优势领跑积分榜,萨卡打进唯一入球,班福……一个江西婺源导游眼中的江苏游客说到江南,你会首先想到哪个省份呢?我首先想到的就是江苏!温润、儒雅和明丽清新的江苏。江苏在中国有很多标签,富裕、温和、教育办得好、民风儒雅。苏州园林难怪,江苏……金融资本,要主动帮助实体经济了2022年10月16日,是一个全国瞩目的日子。上午10点,中国金融行业的大佬们神情严肃地坐在人民大礼堂聆听报告。下午3点后,工商银行、中国银行、建设银行、农业银行、……今日盈利3。6万2022。10。18今日盈利3。6万今天又是在外面跑一天项目,很累,很疲惫。ST澄星(SH600078)今天竟然最后还是顶板了,有点超过我的预期了,接下来震荡震荡,再炒业绩吧?一直突突……高质量建设平安郸城高水平守护人民幸福金秋十月,天高云淡。郸城县千亩人民公园渺渺湖光如镜,行人醉秋风;国家3A级旅游区洺河生态水系四十八里沿线一步一景,小城在画中;世纪广场、中心商场、万洋商贸城、王子小吃街大街小巷……种族歧视!艾格努语出惊人,意大利女排恐遭遇重创中国女排在世界女排联赛和世锦赛上,接二连三的败给意大利女排,尤其是在两次比赛的淘汰赛当中,中国队都是被意大利队给淘汰的,甚至打的中国队一点脾气都没有,可以说意大利女排已经成为中……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网