总:Java提供了一套比较完整的容器类,基本类型是:List、Set、Queue、Map,这些对象类型称为集合类。
一、接口继承关系:
Iterable接口,在java.lang包中,Collection、List、Queue、Set接口继承Iterable接口
可以看出来,List、Queue、Set这三个接口是在java.util包中,继承自Collection接口
Map接口不继承Collection接口,也不继承其它接口
二、Iterable与Iterator的关系
Iterable属于java.lang包,Iterator属于java.util包。
下面,我们先看看Iterable这个接口的api文档的解释:
List、Map、Set、Collection都继承了Iterator接口,这个接口定义了Iterator<T> iterator()方法,在继承这个接口后就能够使用Iterator迭代器了
问题:为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? (来自:http://liuyun025.iteye.com/blog/1321045 )
看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。
因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
三、Collection接口与Collections类之间的关系,以及Arrays类
下面,看一个程序:
public static void main(String[] args) {(1)Arrays类包含操作数组的各种方法,包含有很多的static方法,Arrays.asList(T t)返回List<T>集合独享
//(1)
List<Integer> list = Arrays.asList(1,2,3,4);
//(2)
Collection<Integer> c =
new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
//(3)
Integer[] moreInts = {6,7,8,9,10};
c.addAll(Arrays.asList(moreInts));
//(4)
Collections.addAll(c, 11,12,13,14,15);
Collections.addAll(c, moreInts);
}
(2)通过ArrayList向上转型成为Collection对象
(3)通过Collection对象的addAll方法把数组添加到Collection对象c中
(4)通过Collections类的静态方法addAll(Collection<T> c,T....elements),把参数表中后边的可变参数添加到Collection对象中
四、List(列表)
List列表的特征是以线性的方式存储,允许存储重复的对象
List实现的主要类有三个:
(1)ArrayList:提供了一种可增长数组的实现,优点是随机访问(set()和get())比较快,缺点是插入、删除中间项速度比较慢。
(2)LinkedList:提供了双链表的实现(是基于链表的),对于数据的插入和删除需要的开销比较小
(3)Vector:Vector
类可以实现可增长的对象数组,与ArrayList相比,ArrayList是非同步的,在涉及到多线程的情况下需要使用Vector(在以后的多线程问题中会继续讲到)
五、Set(一个不包含重复元素的 collection)
Set集合中不允许存储重复的对象,集合中的对象不按特定的方式排序
Set接口主要实现了两个类:
(1)HashSet:此类是基于哈希表支持的,是不同步的,天生就是用来提高查找速率的。存入HashSet的对象必须定义hashCode()
(2)TreeSet:基于二叉树的实现,保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
六、Map(映射)
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
Map主要有两个实现类:
HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
TreeMap:基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树