JAVA集合框架
JAVA集合类库与现代大多数数据结构类库一样,也将接口与实现分离,利用这种方式,一旦改变了想法,可以轻松地使用另一种不同的方法实现;
Collection接口和Iterator迭代器接口
集合类的基本接口是Collection,这个接口有两个基本方法:
public interface Collection<E>
{
boolean add(E element);//用于添加元素,如果集合没有返回false,反之返回true
Iterator<E> iterator();//返回Iterator接口对象
}
迭代器接口有三个方法
public interface Iterator<E>
{
E next();//可以逐个返回集合中的元素
boolean hasNext(); //如果迭代器对象还有多个供访问的元素,返回true
void remove();
}
可以使用如下方法访问集合中的每个元素
Collection<String> c = ... ; //使用接口类型存放集合的引用,便于更改实现;
Iterator<String> iter = c.iterator();
//for each循环可以与任何实现了Iterator接口的对象一起工作
//而Collection扩展了Iterator接口
//注:如果访问的是HasSet中的元素,每个元素将会按随机次序出现
for(Sring Element : c)
{
//do something
}
注:1.查找一个元素的唯一方法是调用next方法,Java迭代器可以认为是位于两个元素之间,当调用next方法时,迭代器会越过下一个元素,并返回刚才越过的那个元素的引用;2.决定删除某个元素时需要判断这个元素是否有意义,所以使用remove删除某个元素时,需要调用next越过这个元素;
List接口
List接口用于描述一个有序的集合,可以使用两种访问元素的协议:一种是使用迭代器;一种是使用get和set方法随机访问每个元素。后者不适用于链表,但对数组很有用,实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。ArrayList,Vector都是动态数组实现的,建议在不需要同步时使用ArrayList,而不使用Vector,LinkedList是使用链表实现的。 List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
LinkedList
链表是一个有序集合,每个对象的位置十分重要。使用add方法将会将对象添加到尾部。List还提供一个listIterator()方法,返回一个 ListIterator接口。该接口中包含add方法,但是返回为空,它假定添加元素后会改变链表的结构。
interface ListIterator<E> extends Iterator<E>
{
void add(E element);
E previous(); //返回越过的对象
boolean hasPrevious();
}
如果一个迭代器发现它的集合被另一个迭代器修改了,或者被该集合自身的方法修改了,就会抛出一个Concurrent ModificationException异常,建议不要使用get方法访问LinkedList中的元素,这个方法的效率并不高。
Set接口
Set接口是一种不包含重复的元素的Collection,它是通过散列表实现的,实现Set的常用类有HashSet和TreeSet。由于散列将元素散列在表的各个位置上,所以访问他们的顺序几乎是随机的,只有不关心集合中元素的顺序时才使用HashSet。
TreeSet
树集是一个有序集合,可以按任意顺序将元素插入到集合中,当遍历时,每个值将按排序后的顺序出现,树集是通过红黑树实现的,添加元素时,都被放置在正确的排序位置上。因此,插入一个元素要比HashSet慢。 树集通过实现Comparable接口来比较两个元素的顺序。
public interface Comparable<T>
{
//a.compareTo(b),a在b前返回负值;
int compareTo(T other);
}
map
映射表,使用一个键值对来存储元素,如果提供了键值就能够查找到该值。Java类库为映射表提供了两个通用的实现HashMap和TreeMap。 散列映射表对键进行散列,树映射表用键的整体顺序对元素进行排序。键值必须是唯一的,不能对同一个键存放两个值。 映射表有三个视图,他们是一组实现了Collection接口的对象,或者它子接口视图。分别为:键集,值集合和键值对集。
Set<k> keySet() //实现了Set接口的某个其他类对象
Collection<K> values()
Set<Map.Entry<K, V>> entrySet()
如果要同时查看键值,就可以通过枚举各个条目查看,以避免对值进行查找。
for(Map.Entry<String, Employee> entry : staff.entrySet())
{
String key = entry.getKey();
Employee value = entry.getValue();
\\to do
}