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");
答案 0 :(得分:6)
Queue
显然通过成为Collection
层次结构的一部分来继承这些增加的功能。从多态的角度来看,让Queue
像任何其他Collection
一样行动是有益的,因为它增加了数据结构的可移植性。
从设计角度来看,我不会说这不一定是坏事。想象一下在杂货店排队/排队。在某些情况下,客户可能需要从生产线中间移除。队列的这种特定实现支持这一点,这可能很有用。
虽然你可以争辩说其他方法可以让你自己开枪,你可以轻松地创建Queue
的实现,但不允许remove(Object)
或iterator.remove()
之类的内容如果你想要一个严格的Queue
。
答案 1 :(得分:3)
根据我所学到的,队列有责任坚持先进先出行为。
您可能正在阅读教科书或一些讲义或描述理想化FIFO队列如何工作的内容。但是你没有意识到的是并非所有队列都是FIFO。不是在现实世界中,也不在计算机系统中。 (例如,如果(假设)奥巴马总统去了一家繁忙的麦当劳餐厅,你会发现他立即被排到了队列的前面。这是一个以非FIFO方式行事的队列。)
无论如何,Java Queue
是任何类型队列的接口,而不仅仅是FIFO队列。它还支持优先级队列,以及您可以想到的任何其他排队语义...如果您想提供自己的实现类。
另一点是remove(E)
操作未提供“下一位顾客请”操作。这相当于客户决定他们真的更喜欢披萨......然后走出门外。理想化的队列不支持这一点,但是可用的库类可以...因为应用程序需要能够做这种事情。
底线是Java Collection
类层次结构(包括线索Queue
)被设计为有用且易于使用,而不是严格适合某人的数据结构抽象模型。
但是Queue可能会允许一个sneakIn方法,让你潜入队列的中间 - 那个方法在哪里?
好吧,因为大多数真正的应用程序不需要它,所以它不存在。 (如果这是一个常见的用例,即使不在Queue
接口中,也会在特定的队列实现类中提供这样的方法。)
再一次,Java类和接口是在实际程序中指定它们的实用性和可用性,而不是(在这种情况下),因此它们可以在汉堡联合中模拟POTUS。
可能是我在学校里做过的教科书定义和C / C ++实验室。但
另一种解释是你误解了定义的真正目的,等等。
答案 2 :(得分: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