java集合
表述数据结构的熟悉以及特点
表示注释
在实现方法时,选择不同的数据结构会导致其实现风格以及性能纯在很大差异。java集合为我们提供内容许多可选择的数据结构。
java集合框架
java的最初版本只为我们提供了最为常见的数据结构提供了一组类:Vector、Stack、Hashtable、BitSet与Enumeration,其中Enumeration接口提供了一种用于访问任意容器中的各个元素的抽象机制。
随着javaSE1.2的推出java推出一组完善的数据结构机制。设计人员希望java的数据结构类库可以简单易学而不是想C++的“标准模版库”(即STL)那样复杂,但有希望拥有STL推出的“泛型算法”所具有的优点。
接下来将介绍java对于实现这些功能所做出的设计。
将集合的接口和实现分离
我们通过具体的案例来分析java是怎么实现将集合的接口和实现分离的。
首先来看一下队列,队列是一种数据结构。对于存放在队列中的数据开始遵循先进先出的规则,队接口指出可以在队列的尾部添加元素,可以在队列的头部删除元素。队列的接口最简单的形式如下
/**
* 一个最最简单的队列接口
*/
public interface Queue<E>{
void add(E e);
E remove();
int size();
}
这个接口并没有说队列是如何实现的。队列的实现通常有两种方法,一种是使用循环数组,另一种是使用链表。如下图:
每个实现都可以通过一个实现Queue接口表示。
循环数组:
public class CircularArrayQueue<E> implements Queue<E>{
privata 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>{
privata Link head;
private Link tail;
LinkedListQueue(){......}
public void add (E element){.....}
public E remove(){.....}
public int size(){......}
}
实际上java并没有是叫做CircularArrayQueue和LinkedListQueue的类,这里只是为了说明java把接口和实现分离的设计作为一个列子。如果真的想要一个循环队列可以使用ArrayDeque类,如果是链表队列就直接使用LinkedLIst类,这个实现了Queue接口。
采用这种方式实现队列的好处主要是考虑后期维护时,如果想更改数据的存储结构会十分的方便。
列如刚开始使用
Queue<Customer> expressLane=new CircularArrayQueue();
expressLane.add(new Customer("Harry"));
后来想使用链表时只需要
Queue<Customer> expressLane=new LinkedListQueue();
expressLane.add(new Customer("Harry"));
选择什么样的数据结构,这要根据实际的项目决定。循环数组要比链表更加高效,因此大多数人选择循环数组,。然而这也会付出一定的代价,。循环数组是一个有限的集合,其容量是有限的,当添加的元素超出数组的容量时,就需要对数组进行扩容。频繁的改变容量大小会影响程序的性能,和稳定性。如果程序中要收集的元素没有上限,就最好选择链表来实现。
的,当添加的元素超出数组的容量时,就需要对数组进行扩容。频繁的改变容量大小会影响程序的性能,和稳定性。如果程序中要收集的元素没有上限,就最好选择链表来实现。
在java的API中会发现另一组以Abstract开头的类,有名字可以知道这是一个抽象类,列如,AbstractQueue。这些类是为类库实现这设计的,如果你想要实现自己的队列或者其他的数据结构,继承这些数据结构对应的抽象类比实现Queue接口要轻松很多。