您的位置:首页 > 产品设计 > UI/UE

java基础巩固系列(九):持有对象之间的使用与关系(Iterable、Collection、List、Queue、Set、Map、Stack)

2015-01-17 16:04 525 查看
总: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)
		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);	
			
	}
(1)Arrays类包含操作数组的各种方法,包含有很多的static方法,Arrays.asList(T t)返回List<T>集合独享

(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,它可以返回一个子树
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐