首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的队列允许删除随机元素。这是不是很糟糕?

Java中的队列允许删除随机元素。这是不是很糟糕?
EN

Stack Overflow用户
提问于 2013-01-20 12:24:02
回答 3查看 3.9K关注 0票数 7

Java中的Queue提供了先进先出的数据结构。根据我所了解到的,队列有一定的责任来遵守先进先出的行为。换句话说,您不能从队列中间删除项。然而,在Java中,我们可以使用iterator删除随机的队列元素。

这是一个糟糕的封装设计吗?或者,队列数据结构应该允许这样做吗?

代码语言:javascript
复制
Queue<String> queue = new LinkedList<String>();
queue.add("e1");
queue.add("e2");
queue.add("e3");
queue.add("e4");

queue.remove("e3");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-20 12:52:28

通过成为Collection层次结构的一部分,Queue显然继承了一些添加的功能。从多态的角度来看,让Queue像任何其他Collection一样工作是有益的,因为它增加了数据结构的可移植性。

虽然您可能会认为额外的方法可能会让您搬起石头砸自己的脚,但如果您想要一个严格的Queue,您可以很容易地创建一个不允许remove(Object)iterator.remove()之类的东西的Queue实现。

票数 6
EN

Stack Overflow用户

发布于 2013-01-20 12:52:03

根据我所学到的,队列有一定的责任来遵守先进先出的行为。

您可能读过一本课本或一些课堂讲稿,这些内容描述了理想化的FIFO队列是如何工作的。但您没有意识到的是,并不是所有的队列都是FIFO。不是在现实世界中,也不是在计算机系统中。(例如,如果(假设)奥巴马总统去了一家繁忙的MacDonalds餐厅,你会发现他立即被移到了队列的前面。这是一个以非FIFO方式运行的队列。)

无论如何,Java是任何类型的队列的接口,而不仅仅是Queue队列。它还支持优先级队列,以及您可以想象到的任何其他队列语义...如果你愿意提供你自己的实现类。

另一点是,remove(E)操作没有提供“下一位客户请”操作。这相当于顾客决定他们真的更喜欢披萨……然后走出门外。理想化的队列不支持这一点,但可用的库类支持...因为应用程序需要能够做这类事情。

归根结底,Java (包括线索Queue)被设计为有用且易于使用,而不是严格地适合某人的抽象数据结构模型。

但是

可能会允许一个sneakIn方法,让你偷偷进入队列的中间--那个方法在哪里?

好吧,因为大多数真正的应用程序都不需要它,它就不存在了。(如果这是一个常见的用例,那么将在特定的队列实现类中提供这样的方法,即使不是在Queue接口中。)

同样,Java类和接口是为了它们在实际程序中的实用性和可用性而指定的,而不是(在本例中)这样它们就可以在汉堡店中对POTUS进行建模。

可能我被学校里的课本定义和C/C++实验室洗脑了。

另一种解释是,你误解了定义的真正目的,等等。

票数 3
EN

Stack Overflow用户

发布于 2013-01-20 13:03:16

Java队列不一定是FIFO。队列API说

Queues typically, but do not necessarily, order elements in a FIFO (first-in-first-out) manner

这取决于实现方式,例如,PriorityQueue不是先进先出,但您使用的LinkedList是先进先出。

Queue.remove() API并没有说它删除了一个随机元素,它只是说

代码语言:javascript
复制
Retrieves and removes the head of this queue. 

在你的例子中它必须是

代码语言:javascript
复制
queue.remove();

而且它会移除e1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14421662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档