天天看点

Java集合框架简析

Java集合框架浅谈

一,思考引入集合框架的原因;

二,简析目前集合框架的类图;

Java集合框架简析

注:从图中可以看出,JAVA的集合框架主要通过三个顶层的接口来组织的,分别是Collection,Map,Iterator。其中Iterator接口使用了迭代设计模式,用来统一对所有Collection子类集合的遍历及访问方式。Collection接口主要用来组织传统意义上的集合,它派生了两个子接口List,Set。之所以会派生出这两种接口,是因为我们会根据集合允许存放的数据的不同,以及支持的操作的不同将传统意义上的集合分为了两类,一类是List系,这种集合不支持互异性。而另一类是Set系,这种集合的定义与数学上的集合的定义很相似,支持元素的互异性,无序性,确定性。而Map则是一类用来存放键值对映射关系的集合。

分析一下这个顶级接口:首先来看一下这个接口对集合常用的并集,交集,差集,补集的支持。addAll(Collection<?>)支持并集;retainAll(Collection<?>支持交集;

removeAll(Collection<?>)支持了差集集;补集是相对与全集来说的,接口不提供对补及操作的支持。

    接下来看一下集合常用的对属性判断的支持,集合容量,集合是否为空,一个元素是否在一个集合中,一个子集是否在集合中,分别用了size(),isEmpty(),contains(object),containsAll(Collection<?>)。

     接下来再来看一下集合常见的操作,增,珊,改,查,add(E),addAll(Collection<?>),remove(Object),removeAll(Collection<?>),查使用iterator()接口。集合对改的操作只能间接支持比如先删除,再新增。顶层的接口往往都很凝练,是一种高级抽象。

作为Set和List虽然有很多不同的地方,但他们也有很多相同的地方,作为集合共有的一些方法,如集合的增,删,查,交,并,差等运算都放在了AbstractCollection这个抽象类里面,而这个抽象类则面向接口Iterator<E>接口进行编程。子类继承时,只需要去实现抽象方法,并提够这个接口给父类就可以了。

     有一个不明白的地方,为什么在Collection接口中声明的方法,要在子类Set中再声明一遍?

三,详细分析集合框架中几个主体类的原理;

指定HashMap容量时,要尽量使用2的几次方,这样可以避免一些没所谓的开销。

掌握了上面知识之后,我们可以在创建 HashMap时根据实际需要适当地调整 load factor的值;如果程序比较关心空间开销、内存比较紧张,可以适当地增加负载因子;如果程序比较关心时间开销,内存比较宽裕则可以适当的减少负载因子。通常情况下,程序员无需改变负载因子的值。