use*_*555 6 java queue data-structures
Queue是一个接口。除了通过匿名内部类,您不能直接实例化接口。通常,这不是您要为集合执行的操作。而是选择一个现有的实现。例如:队列q = new LinkedList();
要么
队列q = new ArrayDeque();
通常,您可以根据您感兴趣的性能和并发特性来选择集合实现。
这是如何运作的?接口Queue实施LinkedList意味着什么?
这是否意味着对象可以在FIFO中(先进先出顺序)出队,并且调用链表方法就q可以了?
用一个(可能有些有缺陷的)比喻来解释——把 a 想象LinkedList成一张纸。把对 a 的赋值Queue看作是覆盖了这张纸的所有部分,只有一小部分表明它是一个Queue.
如果你Queue在它上面调用一个方法,它仍然会像LinkedList往常一样做事情,因为那是一张纸。
鉴于大部分内容LinkedList都已涵盖,您看不到它是 a ,您只能看到它是 a Queue,因此您只能调用其Queue上的方法。
整张纸仍然存在 - 您可以简单地移除覆盖物,这与将其转换回 a 是同义词LinkedList,然后您LinkedList可以再次调用它的任何方法。
现在了解更多技术细节:
顺便说一句,LinkedList“通常会”做我上面提到的事情,我的意思是 aLinkedList始终是一个链表,即使您将其分配给 a Queue- 它不会突然开始使用数组作为底层实现,就像ArrayDeque(它也实现Queue) 或其他东西。
Queue实际上并不需要是 FIFO(参见文档)(如果需要,aLinkedList也需要是),所以LinkedList在这方面会有相当多的自由,所以让我们继续使用这个解释Deque- 它有方法支持从前面或后面添加和删除。
因为LinkedListimplements Deque,所以需要实现addFirst功能。根据文档,该addFirst函数需要添加到 的前面Deque,实际上,使用 a LinkedList,它将添加到 the 的前面LinkedList(而 the 的前面LinkedList不需要是 的前面Deque,通过查看在 中Deque实现的方法LinkedList,我们看到 的前面Deque是 的前面LinkedList,并且所有方法从一侧添加/删除,从正确的一侧执行)。
现在是一个重要但有点混乱的注释——LinkedList例如,可以实现Deque并拥有一个addFirst不做它应该做的事情——它可以只是,例如,打印一些随机文本。语言本身没有任何东西可以阻止这一点——因为就编译器而言,实现Deque只需要你定义一堆方法——没有强制执行这些方法应该做什么。就 Java API 和任何体面的库而言,假设实现接口的每个类都符合该接口声称要做的事情应该是安全的,但请记住,没有什么可以阻止它不符合当涉及到更多阴暗的库或经验不足的程序员时。
| 归档时间: |
|
| 查看次数: |
14790 次 |
| 最近记录: |