Java的集合接口和类层次结构是不是很糟糕?

ani*_*nir 15 java collections

我开始知道在Java中,LinkedList类实现了DequeList接口接口.这对我来说有点混乱.

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

add(E e)
add(int index, E element)
Run Code Online (Sandbox Code Playgroud)

Queue 只有以下内容:

add(E e)
Run Code Online (Sandbox Code Playgroud)

所以很明显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是唯一一个继承自列表和队列系列的类,也就是说,没有其他类同时实现这两个类ListQueue(AFAIK).这可能表明LinkedList做得不好吗?

我错了,不必要地思考?

And*_*eas 44

你完全忽略了编程接口的重点.

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

LinkedList<String> queue = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

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

Queue<String> queue = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

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

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


我从来没有被教过队列可以是一个列表,或者更准确地说队列可以像列表一样.

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

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

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

  • @anir是的,不幸的是,他们实现了`Stack`作为一个类,而不是一个接口,回到开头,我们现在已经坚持了.正如[`Stack`]的javadoc(https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html)所说:*"一套更完整,更一致的LIFO堆栈操作由[`Deque`](https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html)接口及其实现提供,应优先使用此类."* (3认同)

for*_*pas 5

@Andreas的答案非常好,所以我的目标是关于你曾经或未被教过的内容:

在计算机科学教学大纲中,我从未被教导过队列可以是一个列表,或者更准确地说,队列可以像列表一样

队列不仅仅是任何列表,而是一种特殊的列表,具有自己的特殊属性和约束.

也就是说,列表可以做的东西,但队列不能.

不,List什么都不能做.它提供了由类实现的可能性,如果该类决定实现它们,那么该类可以完成所有这些工作.

但是列表可以像队列一样运行.

不,List不表现; 它只表明实现它的行为和类可以接受它们的全部或部分,或者它们可以定义新的行为和类.

  • *"在计算机科学教学大纲中,我从未被教导过队列可以是一个列表,或者更准确地说,队列可以像列表一样......"*在大学水平课程中有很多事情没有明确说明.相反,学生应该发展理解和心理技能,为自己解决这些问题. (3认同)