LinkedList类实现了Deque和List接口

Java的集合、接口和类层次结构做得不好吗?

我开始知道在Java中,接口。这对我来说有点混乱。

在计算机科学教学大纲中,我从未被教导过队列可以是一个列表,或者更确切地说,队列可以像列表一样。也就是说,列表可以做的东西,但队列不能。但是列表可以像队列一样运行。例如,Listinterface具有:

add(E e)
add(int index, E element)

但Queue :

add(E e)

所以很明显Queue不允许在特定索引处插入,这是允许的List。其他操作的情况也是如此,例如Queue.remove()vs. List.remove(int index),List.get(int index)vs Queue.peek().。换句话说,list是一种更通用的数据结构,可以模拟Queue。

现在能够模拟与拥有合同子集不同。也就是说,Queue不允许某些操作(索引)List并允许某些操作仅以特定方式完成(仅插入尾部并仅从头部移除)。所以Queue并没有真正对合同进行“补充” List。这正是为什么Queue不在ListJava集合框架中扩展,而是扩展Collection接口。我认为这也是为什么任何一个类都不能实现两者的原因,因为Queue合同与合同冲突List(这就是为什么它们从Collection接口分开)。但是,LinkedList实现两个接口。

我也遇到了答案:

该LinkedList实施情况,以满足Deque合同,所以为什么不把它实现的接口?

我仍然不明白我们怎么说“ LinkedList实施恰好满足Deque合同”。队列的概念不允许插入任意索引。因此,Queue界面没有这样的方法。

但是,我们只能通过接口强制执行合同,并且不能禁止某些方法的实现。作为列表(在其名称“列表”),我觉得这是不正确的有排队的方法peek(),pop()并add(int index, E element)在LinkedList。

我相信,相反,我们应该有一个单独的类LinkedQueue,它可以链接队列的实现,类似于LinkedBlockingQueue包含链接的实现BlockingQueue。

另请注意,这LinkedList是唯一一个继承自列表和队列系列的类,也就是说,没有其他类可以实现这两个类List和Queue(AFAIK)。这可以表明LinkedList做得不好吗?

我错了,不必要地思考?

提问于 2018-10-22

2 个回答

热门排序

用户回答回答于 2018-10-22

完全忽略了。

如果你需要Queue,你永远不会写:

LinkedList<String> queue = new LinkedList<>();

因为,你是对的,这将允许你使用非队列方法。相反,你编程到这样的界面:

Queue<String> queue = new LinkedList<>();

现在您只能访问6 种方法(以及所有方法)。因此,即使实现了更多方法,您也无法再访问它们。

因此,如果您需要队列,则选择最适合您所需的性能,存储和访问特性的接口实现Queue,例如

    使用更多内存,但在清空队列时收缩。 使用较少的内存,但它不会缩小。 是一个具有元素优先级的非FIFO队列。 ,支持多线程并发访问。 和更多...
我从来没有被教过队列可以是一个列表,或者更确切地说队列可以像列表一样。

请记住,implements定义一种行为类似的关系。一个LinkedList 行为就像一个List。一个LinkedList 行为就像一个Deque。一个LinkedList 行为就像一个Queue。

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

该样的行为关系唯一无二的一种方式

经验分享 程序员 微信小程序 职场和发展