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")
循环数组要比链表高效,因此多数人优先选择循环数组。
但是循环数组是一个有界数组,即容量有限。如果使用的对象数量没有上限,最好使用链表实现。