7

Queue在Java中提供了FIFO数据结构。据我所知,队列有责任遵守先进先出的行为。换句话说,您不能从队列中间删除项目。但是,在 Java 中,我们可以使用iterator.

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

Queue<String> queue = new LinkedList<String>();
queue.add("e1");
queue.add("e2");
queue.add("e3");
queue.add("e4");

queue.remove("e3");
4

3 回答 3

6

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

从设计的角度来看,我不会说它一定是坏的。想象一下杂货店的队列/线路。在某些情况下,可能需要将客户从队伍的中间移除。队列的这种特定实现支持这一点,这可能很有用。

虽然您可能会争辩说其他方法可能会让您在脚下开枪,但您可以轻松创建一个Queue不允许像这样的实现,remove(Object)或者iterator.remove()如果您想要严格的Queue.

于 2013-01-20T04:52:27.620 回答
3

据我所知,队列有责任遵守先进先出的行为。

您可能一直在阅读教科书或一些讲义或描述理想化 FIFO 队列如何工作的东西。但是你没有意识到并不是所有的队列都是先进先出的。不在现实世界中,也不在计算机系统中。(例如,如果(假设)奥巴马总统去了一家繁忙的麦当劳餐厅,您会发现他立即被排在了队列的最前面。这是一个以非先进先出方式表现的队列。)

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

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

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


但是 Queue 可能允许一个偷偷摸摸的方法,它可以让你潜入队列的中间——那个方法在哪里?

好吧,因为大多数实际应用程序不需要它,所以它不存在。(如果这是一个常见的用例,即使不在Queue接口中,也会在特定的队列实现类中提供这样的方法。)

再一次,Java 类和接口是针对它们在实际程序中的实用性和可用性而指定的,而不是(在这种情况下)因此它们可以在汉堡联合中对 POTUS 进行建模。

可能我被我在学校做过的教科书定义和 C/C++ 实验室洗脑了。

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

于 2013-01-20T04:52:02.607 回答
1

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

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

这取决于实现,例如 PriorityQueue 不是 FIFO,但您使用的 LinkedList 是 FIFO。

Queue.remove() API 没有说它删除随机元素,它说

Retrieves and removes the head of this queue. 

在你的例子中,它必须是

queue.remove();

它会删除e1

于 2013-01-20T05:03:15.757 回答