java deque与queue_Java中的Queue与Deque

Queue接口的实现类

Queue接口做为队列数据结构,java在实现的时候,直接定义了Deque接口(双端队列)来继承Queue接口,而且只实现Deque接口。这样java中的双端队列就囊括了队列、双端队列、堆栈(Deque接口又定义了Stack的操做方法)这3种角色的功能。java

因此咱们在使用的时候直接使用的是Deque接口的实现类,固然Deque接口继承自Queue接口。数组

1460000016524799?w=205&h=265

Deque接口的实现类

咱们记住,Deque接口所能表明的数据结构:队列,双端队列,堆栈。数据结构

ArrayDeque

1460000016660297?w=663&h=540

1.内部使用transient Object[] elements数组来实现。拥有head/tail这2个头尾指针。最小初始化容量8。它仍是一个循环队列。并发

1460000016524800?w=560&h=329

2.在扩容/初始化的时候,数组的内部大小必定是2个幂次方,也就是说大小只多是:八、1六、3二、64这样的倍增。spa

1460000016524801?w=434&h=83

1460000016524802?w=536&h=298

3.它做为堆栈、队列、双端队列的操做和LinkedList的操做是一致的,只是内部的实现不一样。固然,它们也有区别。指针

ArrayDeque实现了双端队列,内部使用循环数组实现,这决定了它有以下特色:code

在两端添加、删除元素的效率很高,动态扩展须要的内存分配以及数组拷贝开销能够被平摊,具体来讲,添加N个元素的效率为O(N)。

根据元素内容查找和删除的效率比较低,为O(N)。

与ArrayList和LinkedList不一样,没有索引位置的概念,不能根据索引位置进行操做(没法随机访问,这也符合队列的性质)。

4.操做示例,要记住,Deque具备3种数据结构的特性,不一样的数据结构应该使用不一样的语义化方法!对象

1460000016524803?w=466&h=682

1460000016524804?w=412&h=316

LinkedList

1460000016660298?w=851&h=625

LinkedList中在“List有序集合”这一篇文章中讲过了,从队列和双端队列的角度来看,LinkedList和ArrayDeque的方法声明都是一致的。只不过LinkedList较之于ArrayDeque多实现了List接口,还具备有序集合List的特性。继承

ArrayDeque和LinkedList的比较

ArrayDeque和LinkedList都实现了Deque接口,应该用哪个呢?若是只须要Deque接口,从两端进行操做,通常而言,ArrayDeque效率更高一些,应该被优先使用。不过,若是同时须要根据索引位置进行操做,或者常常须要在中间进行插入和删除,则应该选LinkedList(注意,这里使用的是List特性,而不是Deque特性了)。索引

PriorityQueue

有一个直接实现了Queue接口的类,可是它并非真正意义上的队列,而是一个优先队列!

1460000016660299?w=533&h=513

PriorityQueue保存元素的顺序并非按照加入的顺序,而是根据元素的大小(实现Comparable接口或提供Comparator类)来决定元素在Queue队列中的顺序。默认状况若是咱们存入String对象,则是按降序排列。

1460000016663595?w=550&h=367

能够看到,优先队列的默认大小为11,内部使用Object[]数组来实现队列结构。

1460000016663596

对于扩容操做,能够看到。若是当前容量小于64,则容量增长2;若是当前容量大于等于64,则变为原来的1.5倍。

讲讲Queue/Deque对应的并发类

PriorityQueue优先队列没有对应的并发类。可是Queue接口有对应的并发实现类:java.util.concurrent.ConcurrentLinkedQueue类。

Deque接口有对应的并发实现类:java.util.concurrent.ConcurrentLinkedDeque类。

Collection集合下的Queue/Deque

1460000016660302?w=649&h=1004

从类图来看,实现了Queue接口的类就是PriorityQueue,但要注意它是优先队列!实现了Deque接口的类有ArrayDeque和LinkedList,2者的内部实现不一样,一个是数组,另外一个是链表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值