我开始知道在 Java 中,LinkedList
class implements both Deque
and List
接口(interface)。
这让我有些困惑。
在计算机科学教学大纲中,从未有人教过我队列可以是一个列表,或者更准确地说,队列可以表现得像一个列表。也就是说,有些事情列表可以做,但队列不能。但是列表可以像队列一样工作。例如,List
接口(interface)有 the following methods :
add(E e)
add(int index, E element)
但是队列
has only the following :
add(E e)
很明显 Queue
不允许在特定索引处插入,这在 List
中是允许的。其他操作也是如此,例如 Queue.remove()
与 List.remove(int index)
、List.get(int index)
与 Queue.peek()
。
换句话说,列表是一种更通用的数据结构,可以模拟Queue
。
现在能够模拟不同于拥有合约子集。也就是说,Queue
不允许 List
的某些操作(索引),并且只允许以特定方式完成某些操作(仅在尾部插入,仅从头部删除)。所以 Queue
并没有真正对 List
的契约进行“添加”。这就是为什么 Queue
没有扩展 Java 集合框架中的 List
,而是都扩展了 Collection
接口(interface)。我相信这也是为什么任何类同时实现两者都是不正确的,因为 Queue
的契约(Contract)与 List
的契约(Contract)冲突(这就是为什么他们从 Collection
接口(interface)分开)。但是,LinkedList
实现了这两个接口(interface)。
我也遇到了this回答:
The
LinkedList
implementation happens to satisfy theDeque
contract, so why not make it implement the interface?
我仍然不明白我们怎么能说“LinkedList
实现恰好满足 Deque
契约”。队列的概念不允许在任意索引处插入。因此,Queue
接口(interface)没有这样的方法。
然而,我们只能通过接口(interface)执行契约,不能禁止某些方法的实现。作为列表(名称中有“List”),我觉得使用队列方法 peek()
、pop()
和 add(int index , E 元素)
在 LinkedList
中。
我相信,相反,我们应该有单独的类 LinkedQueue
,它可以有队列的链接实现,类似于 LinkedBlockingQueue
,它包含 BlockingQueue
的链接实现>。
另请注意,LinkedList
是唯一继承自列表和队列系列的类,也就是说,没有其他类同时实现了 List
和 队列
(AFAIK)。这是否表明 LinkedList
有问题?
我是不是完全错了,是不是多虑了?
最佳答案
您完全忽略了 programming to interface 的要点.
如果你需要一个Queue
,你永远不会写:
LinkedList<String> queue = new LinkedList<>();
因为,您是对的,这将允许您使用非队列方法。相反,您可以像这样对接口(interface)进行编程:
Queue<String> queue = new LinkedList<>();
现在您只能访问 6 Queue
方法(以及所有 Collection
方法)。所以,即使LinkedList
实现了更多方法,您将无法再访问它们。
因此,如果您需要一个队列,您可以选择最适合您所需的性能、存储和访问特性的 Queue
接口(interface)的实现,例如
LinkedList
使用更多内存,但当队列清空时它会收缩。ArrayDeque
使用更少的内存,但不会缩小。PriorityQueue
是具有元素优先级的非 FIFO 队列。ConcurrentLinkedQueue
,ConcurrentLinkedDeque
支持多线程并发访问。还有更多...
I was never taught that queue can be a list, or more precisely queue can behave like a list.
请记住,implements
定义了一个behaves like 关系。 LinkedList
表现得像 List
。 LinkedList
表现得像 Deque
。 LinkedList
表现得像 Queue
。
但是仅仅因为 LinkedList
表现得像所有这些,并不意味着 List
表现得像 Queue
或者 Queue
表现得像 List
。他们没有。
表现得像关系只有一种方式。
关于java - Java 的集合接口(interface)和类层次结构做得不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904106/