Java中的Queue提供了先进先出的数据结构。根据我所了解到的,队列有一定的责任来遵守先进先出的行为。换句话说,您不能从队列中间删除项。然而,在Java中,我们可以使用iterator删除随机的队列元素。
这是一个糟糕的封装设计吗?或者,队列数据结构应该允许这样做吗?
Queue<String> queue = new LinkedList<String>();
queue.add("e1");
queue.add("e2");
queue.add("e3");
queue.add("e4");
queue.remove("e3");发布于 2013-01-20 12:52:28
通过成为Collection层次结构的一部分,Queue显然继承了一些添加的功能。从多态的角度来看,让Queue像任何其他Collection一样工作是有益的,因为它增加了数据结构的可移植性。
虽然您可能会认为额外的方法可能会让您搬起石头砸自己的脚,但如果您想要一个严格的Queue,您可以很容易地创建一个不允许remove(Object)或iterator.remove()之类的东西的Queue实现。
发布于 2013-01-20 12:52:03
根据我所学到的,队列有一定的责任来遵守先进先出的行为。
您可能读过一本课本或一些课堂讲稿,这些内容描述了理想化的FIFO队列是如何工作的。但您没有意识到的是,并不是所有的队列都是FIFO。不是在现实世界中,也不是在计算机系统中。(例如,如果(假设)奥巴马总统去了一家繁忙的MacDonalds餐厅,你会发现他立即被移到了队列的前面。这是一个以非FIFO方式运行的队列。)
无论如何,Java是任何类型的队列的接口,而不仅仅是Queue队列。它还支持优先级队列,以及您可以想象到的任何其他队列语义...如果你愿意提供你自己的实现类。
另一点是,remove(E)操作没有提供“下一位客户请”操作。这相当于顾客决定他们真的更喜欢披萨……然后走出门外。理想化的队列不支持这一点,但可用的库类支持...因为应用程序需要能够做这类事情。
归根结底,Java (包括线索Queue)被设计为有用且易于使用,而不是严格地适合某人的抽象数据结构模型。
但是
可能会允许一个sneakIn方法,让你偷偷进入队列的中间--那个方法在哪里?
好吧,因为大多数真正的应用程序都不需要它,它就不存在了。(如果这是一个常见的用例,那么将在特定的队列实现类中提供这样的方法,即使不是在Queue接口中。)
同样,Java类和接口是为了它们在实际程序中的实用性和可用性而指定的,而不是(在本例中)这样它们就可以在汉堡店中对POTUS进行建模。
可能我被学校里的课本定义和C/C++实验室洗脑了。
另一种解释是,你误解了定义的真正目的,等等。
发布于 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并没有说它删除了一个随机元素,它只是说
Retrieves and removes the head of this queue. 在你的例子中它必须是
queue.remove();而且它会移除e1
https://stackoverflow.com/questions/14421662
复制相似问题