JAVA集合框架

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值