java集合框架是什么?
java集合框架是对数据结构和算法用法的实现的封装,包括map、set、list、tree、array、hastabel等其他的集合类型.
在C++中类似的是标准模板库.
根据
维基百科了解到,JCF框架是从1.2版本才出现的,主要是java大牛
Joshua_Bloch设计开发,这个人也就是Google首席工程软件师,同时也是《
Effective Java》的作者.
java集合框架解决了什么问题?
我们在程序设计中,需要处理的数据分为基本数据和复合数据,后者常见的组织形式就是类。类对象通常是以动态形式分配的。
譬如在内存空间分配new一个对象。我们在处理的时候,面对的不是单个基本对象或者单个基本类,而是多个数据类型,那么用什么来处理多个对象呢?就是数组。数组也是一种实现集合的数据结构,可以存放多个数据。
数组的优点是通过下标检索元素非常方便,但是
缺点也是显而易见:空间固定而且不能够稳定增长。所以不是解决一切集合问题的工具。我们可能需要一些新的数据结构的工具来处理集合,其实数组本身就是一种线下有序的数据结构。
数据结构的基础就是集合论.
为什么这么说呢?上面说过,现在我们要研究的不是单个的基 本类型或对象,多个对象的整体不就是集合吗?从OO的角度上看,集合也是一种对象,但它是一种特殊的对象:对象的容器(注意,我们这里没有继续讨论基本类 型的集合,因为基本类型和存储分配方式与对象有着本质的差别)。集合论的一个根本问题就是:给定一个元素,集合必须能够回答该元素是或者不是属于这个集 合。还有一个问题也很重要,就是:如果元素是属于一个集合,那该元素在集合中的地位应该是唯一的,或者说它是
唯一确定
的。当然还有其它问题,譬如查找、遍历、排序等等,这和具体的集合类型相关,后面将会讲到。
JCF框架的结构介绍和一些基本概念
一:结构
下面这张图是常见的JCF框架的结构图
上面图看起来非常的多,比较乱,其实很多的软件的一个模块的设计都比这复杂。
上面黑色背景的表示是接口,我们可以看到
java提供了以下接口
第一级:Collection、
第一级:Collection、
二级: List接口、Set接口、Map接口
三级: RandomAcess、SortedSet、SortedMap
如果我们学过数学或者没有忘记的话,应该知道,List、Set、Map其实是对数学集合概念的抽象和封装。
我们把
Collection
接口置于最顶上,意思是想说:Collection其实是整个JCF家族中的“祖宗”,几乎所有的JCF成员都源自该接口,或者和它有密切的关系,
看过Collection接口的文档或者源码就可以知道,
Collection提供关于集合的一些通用操作的接口,包括插入(
add
()方法)、删除(
remove
()方法)、判断一个元素是不是其成员(
contains
()方法)、遍历(
iterator
()方法)等等。注意了,前面的“废话”在这里将得到体现:
Set
接口体现的是“无序集”的概念,它是不允许有重复元素出现的;
List
接口代表“有序集”;而
Map
接口则是“映射” ,其实
Map.Entry
接口就是代表一个“元素对”我们可以通过Map的
entrySet
() 方法得到这样一个由“元素对”组成的Set对象。我们注意到Set和List都是从“祖宗”Collection派生的,而Map不是,毕竟对一对元素的 操作与对单个元素的操作还是有区别的,但是如果你仔细对照一下Collection和Map的源代码,以及它们的直接后代
AbstractCollection
和
AbstractMap
的源代码,你将会发现很多相似的地方,所以我们仍然可以把Map看成是和Collection有着血缘关系的接口,而和Set,List一起处于并列的位置。
有了“无序集”,“有序集”和“映射”,我们就可以定义各种各样的抽象数据结构了,譬如常见的向量,链表,堆栈,哈希表,平衡二叉树等。
从上我们了解到了,java集合框架的本质是对数据结构的抽象,
具体内容的掌握
你了解就jcf的层次和一些基本概念后呢,重要的是使用JCF 框架,所以需要了解对象的具体操作,比如List如何操作、Set如何操作
Map如何操作,集合里面包含的算法等等
具体的内容的掌握
1:主要用在哪些方面呢?
1:需要了解集合有哪些元素?遍历元素
2:如何根据条件找到元素?:查找元素
一:Collection:接口
Collection提供了实现了Iterable接口,实现了这个接口表示支持迭代功能。
Collection接口支持添加元素、删除元素、遍历查找元素和是否包含子集方法、并且支持迭代器和转成数组功能。
根据源代码可以看到提供了如下的方法:
size();
isEmpty();
contains();
iterator();
toArray();
add();
remove();
containsAll();
addAll();
removeAll(Collection<?> c);;
retainAll();
clear
并且提高了一个AbstractCollection抽象类,这个抽象类实现了Collection接口,实现了除了Iterator()和size() 外的所有的方法,当然我们也可以找自由的自己去实现这个接口
二:Set接口
1:Set接口实现了Collectio接口,但是不支持重复的元素的,Set的方法和Collection接口方法一样,并没有提供新的功能,这点从源码上可以看的出来。
2:和AbstractCollection一样,java提供了 AbstractSet抽象类,实现了equals()、hashCode ()和removeAll()方法
如何判断集合的对象相等?
3:java提供了2个通用的Set接口的实现:HashSet和TreeSet,通常我们使用这两个类来存储不重复元素。
2.1 HashSet
1: private transient HashMap<E,Object> map 来存储对象
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
看这段代码,创建一个hashset对象的时候,自动分配了一个HashMap对象,
引用资料:
http://www.newsmth.net/pc/pccon.php?id=3559&nid=105600&order=&tid=7082
http://www.janeve.me/articles/which-java-collection-to-use
http://www.developer.com/java/other/article.php/767451/Data-Structures-in-Java-Part-2-What-Is-a-Collection.htm