Stack是ADT的元素集合,具有特定的删除顺序= LIFO(后进先出),允许重复,
队列是元素集合的ADT,具有特定的删除顺序= FIFO(先进先出),允许重复,
LinkedList是列表的实现,
Set是不允许重复的元素集合的ADT,
Bag是元素集合的ADT,允许重复.
通常,任何包含元素的东西都是Collection.
任何允许重复的集合都是Bag,否则就是Set.
通过索引访问元素的任何包都是List.
在最后一个之后附加新元素并且具有从头部(第一索引)移除元素的方法的Bag是Queue.
在最后一个之后附加新元素并且具有从尾部(最后一个索引)移除元素的方法的Bag是Stack.
示例:在Java中,LinkedList是一个集合,包,列表,队列,你也可以使用它,因为它支持堆栈操作(添加~addLast~push,peekLast,removeLast~pop),所以你可以调用它它也堆叠.为什么它没有实现Stack接口的原因是,偷看方法是由Queue实现保留的,它检索列表的头部(第一个元素).因此,在LinkedList的情况下,“堆叠方法”从Deque导出.
Bag是否包含remove(Object)可能取决于实现e. G.您可以实现自己的Bag类型,支持此操作.您还可以实现get(int)操作来访问指定索引上的对象. get(int)的时间复杂度取决于您的实现e. G.一个人可以通过链表实现Bag,所以复杂度平均为O(n / 2),另一个通过可调整大小的数组(array-list),通过索引直接访问元素,因此复杂度为O(1) .
但Bag的主要思想是,它允许重复和迭代这个集合.它是否支持其他有用的操作取决于实现者的设计决策.
使用哪种收集类型取决于您的需求,如果不需要重复,您将使用Set而不是Bag.此外,如果你关心删除订单,你会选择Stack或Queue,它们基本上是具有特定删除顺序的包.您可以将Bag视为Stack和Queue的超类型,它通过特定操作扩展其api.
大多数情况下,您只需要收集对象并以某种方式处理它们(迭代元素处理).因此,您将使用最简单的Bag实现,即单向链接列表.