JAVA集合框架
Java集合框架——规则集
1.集合
Java集合框架支持三种主要类型:规则集(Set),线性表(List)和队列(Queue)。Set的实例用于存储一组不重复的元素。List的实例用于存储一个由元素构成的有序集合,Queue的实例用于村粗具有先进先出处理方式的对象。这些集合的通特性都被定义在接口中,而实现是在具体类中提供的。Java集合类框架中定义的所有接口和类都存储在java.util中。
Java集合框架的设计师使用接口、抽象类和具体类共同实现的。用接口定义框架,用抽象类提供这个接口的部分实现,具体类用具体的数据结构实现这个接口。
Java集合框架支持一下两种类型的容器:
- 集合(Collection):用于存储一元素。
- 图(Map):用于存储键/值对。
Collection是描述所有序列容器的共性的根接口,它可能会被认为是一个附属接口,即因为要表示其他若干个接口的共性而出现的接口。java.util.AbstractCollection提供了Collection的默认实现,使得我们可以创建AbstractCollection的子类型,而其中没有不必要的代码的重复。
1.1 Collection接口和AbstractCollection类
Collection接口是处理对象集合的根接口。AbstractCollection类是提供Collection接口部分实现的抽象类。在Java集合框架中,抽象类实现了除了Size和iterator之外的所有方法,上述两个方法在合适的具体类中实现。Collection接口提供了在集合中添加和删除的基本操作。以下表格将展示出Collection接口中的具体方法。
方法名 | 功能 |
---|---|
boolean add(E e) | 向集合中添加新元素e |
boolean addAll(Collection c) | 将集合c中的所有元素添加给这个集合 |
void clear() | 删除集合中的所有元素 |
boolean contains(Object o) | 判断集合是否包含元素o |
boolean contains(Collection c) | 判断集合是否包含集合c中的所有元素 |
boolean equals(Object o) | 判断该集合与另一个集合是否相等 |
int hashCode() | 返回该集合的散列码 |
boolean isEmpty() | 判断该集合是否包含元素,若为空则返回true |
Iterator iterator() | 返回该集合中元素所用的迭代器 |
boolean remove(Object o) | 从集合中删除元素o |
boolean reamoveAll(Collection c) | 从集合中删除c包含的所有元素 |
boolean retainAll(Collection c) | 保留集合中c包含的所有元素 |
int size() | 返回集合的元素个数 |
Object[] toArray() | 返回该集合的元素构成的数组Object |
上述方法中有一个迭代器方法,即iterator(),该方法返回这个集合元素中所使用的迭代器,迭代器中包含了一系列包括遍历、判断是否还有下一位元素等等的方法。这里给出迭代器中的具体方法。
方法名 | 功能 |
---|---|
boolean hasNext() | 如果迭代器有更多的元素需要遍历返回true |
E next() | 返回下一个元素 |
void remove() | 删除使用next方法获取的最后一个元素 |
2. 规则集
规则集(Set)扩展了collection接口,但并没有引入新的方法或常量,知识规定sET的实例不包含重复的元素。实现Set的具体类必须要确保没有向这个规则集添加重复的元素。AbstractSet类是一个抽象类,它扩展了AbstractCollection类并实现了Set接口。AbstractSet提供了equals方法和hashCode方法的具体实现。规则集的散列码是指这个规则集中所有元素散列码的和。
Set接口下有三个具体类:散列类HashSet,链式散列集LinkedHashSet以及树形集TreeSet。
2.1 散列集HashSet
HashSet类是一个具体类,可以用于存储互不相同的任何元素。默认情况下,初始容量为16且客座率为0.75,这表示当HashSet内容量达到12时(初始容量的75%),散列集的容量会翻倍到32。比较高的客座率会降低空间开销,但会增加查找时间。由于规则集是Collection的一个实例,因此所有定义在Collection中的方法都可以用在规则集上。构造散列集方法如下所示。
public class testCollection{
public static void main(String[] args){
java.util.Set<E> set1=new java.util.HashSet<E>();
}
}
2.2 链式散列集LinkedHashSet
LinkedHashSet用一个链表实现来扩展HashSet类,它支持对规则集内的元素排序。HashSet中的元素时没有被排序的,而LinkedHashSet中的元素可以按照他们插入规则集的顺序提取。LinkedHashSet的构造方法类似于HashSet。如果不许要维护元素被插入的顺序,就应该使用HashSet,因为后者比LinkedHashSet更加高效。构造方法如下。
import java.util.*;
public class testCollection{
public static void main(String[] args){
Set<E> set=new LinkedHashSet<E>();
}
}
2.3 树形集TreeSet
SortedSet是Set的一个子接口,它可以确保规则集中的元素时有序的。另外TreeSet还提供了first()和last()方法以返回规则集中的首尾元素,以及headSet(E toElement)和tailSet(E fromElement)方法,上述两个方法返回规则集中元素小于toElement的部分和元素大于或等于fromElement的那一部分。
TreeSet实现了SortedSet接口的一个具体类。只要添加的元素是可以比较的,就可以将他们添加到一个树形集当中。下面是两种比较对象的方法。
- 使用Comparable接口。添加到规则集中的元素都是Comparable的实例,因此可以使用compareTo的方法对他们进行比较。
- 使用Comparator接口。并非所有的类都实现了Comparable接口,或者实现Comparable接口的类中不想使用compareTo的方法进行比较,那么可以给规则集中的元素指定一个比较器。
Java集合框架中的所有具体类都至少包含两个构造方法,一个是创建空集合的无参构造方法;另一个是用某个集合来创建实例的构造方法。以下程序给出了TreeSet的具体构造方法。
import java.util.*;
public class testCollection{
public static void main(String[] args){
TreeSet<E> set=new TreeSet<E>();
}
}
3 小结
总而言之,当我们在更新一个规则集时,如果不需要保持元素的排序关系,就应该使用散列集(HashSet),因为在散列集中插入和删除元素所花费的时间较少。当需要一个排好序的集合时,可以从这个散列集创建一个树形集。