Java 最初版本只提供了最初的几个 Java 集合框架个类:
- Vector
- Stack
- Hashable
- BitSet
- Enumeration
其中 Enumeration 接口提供了一种用于访问任意容器中各个元素的抽象机制。
Java 集合类库将接口( interface )与实现(implementation)分离。
队列是如何分离的
队列涉及的几个操作:
- 在队尾添加元素
- 在队头删除元素
- 查找队列中元素的个数
特点:先入先出
队列的接口:
public interface Queue<E> // a simplified form of the interface in the stardard library { void add(E element); E remove(); int size(); }
在数据结构课中,队列通常有两种实现方式:
- 使用循环数组;但这种方式的局限是队列的长度有限。
- 使用链表
代码表示如下:
public class CircularArrayQueue<E> implements Queue<E> // not an actual library class { private int head; private int tail; CircularArrayQueue(int capacity) {...} public void add(E element) {...} public E remove() {...} public int size() {...} private E[] elements; } public class LinkedListQueue<E> implements Queue<E> // not an actual library class { private Link head; private Link tail; LinkedListQueue() {...} public void add(E element) {...} public E remove() {...} public int size() {...} }
注释:实际上,Java 类库没有名为 CirclularArrayQueue 和 LinkedListQueue 的类。这里只是以这些类作为示例来解释集合接口与实现在概念上的区分。
Queue 的使用
假设定义了上述的 CircularArrayQueue
和 LinkedListQueue
之后,就可以直接使用:
Queue<Customer> expressLane = new CircularArrayQueue<>(100); expressLane.add(new Customer("Harry")
Queue<Customer> expressLane = new LinkedListQueue<>(); expressLane.add(new Customer("Bug")
循环数组要比链表高效,因此多数人优先选择循环数组。
但是循环数组是一个有界数组,即容量有限。如果使用的对象数量没有上限,最好使用链表实现。