一、集合简介
在正常实现方法或者关注性能时,你选择的不同的数据结构会带来很大的差异。 在大学的计算机科学课程中,有一门数据结构课程 ,通常要讲授一个学期。下面仅仅记录一下标准库中的集合函数。
集合的特点:
集合用来存储不同类型的对象(基本数据类型除外),存储长度可变。
java集合中实际存放的只是对象的引用,每一个集合元素都是一个引用变量,实际内容都放在堆内存中或者方法区里面,但是基本类型是在栈里分配空间的,栈上的数据随时都会被收回。
二、集合框架
java最初只为最常见的数据结构提供了很少的一组类:Vector、Stack、HashTable 、 BitSety与Enumeration接口,其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制。这是一种很明智的选择,想要建立一个全面的集合类库需要大量的时间和高超的技能。虽然这些类都非常有用,但是它们缺少了一个核心的,统一的主题。
随着java1.2的问世,设计人员感到是退出一组功能完善的数据结果的时候了。面对一堆相互冲突的设计策略,他们希望让类库规模很小而且易于学习。
集合框架的被设计要满足以下几个目标
1.该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现必须也是高效的。
2. 该框架允许是不同类型的集合,以类似的方式工作,具有高度的互操作性。
3.对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕着一组标准接口设计。你可以直接使用这个接口的标准实现,诸如:LinkedList,HashSet,和TreeSet等,除此之外你也可以通过这个接口实现自己的集合。
与现代的数据结构类库常见的做法一样,java集合框架类库也将接口与实现分离。接下来用队列(queue)来说明是如何分离的。
队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中的元素个数,当需要收集对象,并按照“先进先出”方式检索对象时就应该使用队列。
队列接口的最简单形式可能类似下面这样
public interface Queue<E> {
void add(E element);
E remove();
int size();
}
这个接口并没有说明队列是如何实现的。队列通常有两种实现方式:一种是使用循环数组;另一种是使用列表;
每一个实现都可以用一个实现了Queur接口的类表示
注:实际上,java类库并没有名为CircuarArrayQueue和LinkedListQueue的类。这里只是以这些类作为示例来解释集合接口与实现在概念上的区分。
//循环数组实现
public class CircularArrayQueue<E> implements Queue<E>{
private int head; //头
private int tail; //尾
CirularArrayQueue(int capacity){....}
public void add(E element){....}
public E remove(){....}
public int size(){....}
private E[] elements;
}
//使用链表实现
public class LinkedListQueue<E> implements Queue<E>{
private Link head; //头
private Link tail; //尾
LinkedListQueue(){...}
public void add(E element){...}
public E remove(){...}
public int size(){...}
}
当在程序中使用队列时,一旦已经构造了集合,就不需要知道究竟使用了那种实现。因此,只有在构造集合对象时,才会使用具体的类。
接口本身并不能说明那种实现的效率究竟如何。循环数组要比链表更高效,因此多数人优先选择了循环数组。不过,通常来讲,这样做也需要付出一定代价。
循环数组是一个有界集合,即容量有限。如果程序中要收集的对象数量没有上线,就最好使用链表来实现。
集合接口: