我开始知道在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是唯一一个继承自列表和队列系列的类,也就是说,没有其他类同时实现这两个类List和Queue(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,例如
LinkedList 使用更多内存,但在清空队列时收缩.
ArrayDeque 使用较少的内存,但它不会缩小.
PriorityQueue 是具有元素优先级的非FIFO队列.
ConcurrentLinkedQueue,ConcurrentLinkedDeque支持多线程并发访问.
和更多...
我从来没有被教过队列可以是一个列表,或者更准确地说队列可以像列表一样.
请记住,implements定义一种行为类似的关系.一个LinkedList 行为就像一个List.一个LinkedList 行为就像一个Deque.一个LinkedList 行为就像一个Queue.
但仅仅因为LinkedList表现得像所有这些,并不意味着List 表现得像一个Queue或Queue 表现得像一个List.他们不.
该样的行为关系唯一无二的一种方式.
@Andreas的答案非常好,所以我的目标是关于你曾经或未被教过的内容:
在计算机科学教学大纲中,我从未被教导过队列可以是一个列表,或者更准确地说,队列可以像列表一样
队列不仅仅是任何列表,而是一种特殊的列表,具有自己的特殊属性和约束.
也就是说,列表可以做的东西,但队列不能.
不,List什么都不能做.它提供了由类实现的可能性,如果该类决定实现它们,那么该类可以完成所有这些工作.
但是列表可以像队列一样运行.
不,List不表现; 它只表明实现它的行为和类可以接受它们的全部或部分,或者它们可以定义新的行为和类.
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |