java - Java 的集合接口(interface)和类层次结构做得不好吗?

标签 java collections

我开始知道在 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 the Deque 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)的实现,例如


I was never taught that queue can be a list, or more precisely queue can behave like a list.

请记住,implements 定义了一个behaves like 关系。 LinkedList 表现得像 ListLinkedList 表现得像 DequeLinkedList 表现得像 Queue

但是仅仅因为 LinkedList 表现得像所有这些,并不意味着 List 表现得像 Queue 或者 Queue 表现得像 List。他们没有。

表现得像关系只有一种方式。

关于java - Java 的集合接口(interface)和类层次结构做得不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904106/

相关文章:

java - 使用 ByteBuffer 从 Socket 读取数据的更快方法?

Java API 与框架?

java - 我们可以根据 Map 中的键和值对 Set 进行排序吗?

java - java中的多级关联数组,如php

资源包中的 java.util.MissingResourceException

java - Springfox swagger继承支持

java - 通用类型元素的 ArrayList - 可以做到吗?

java - 将用户输入存储在不是从 0 开始的数组中

java - HTML 标签查找器

java - 方法类型参数化在 for 循环中不起作用