集合框架
来源:互联网 发布:linux关闭tomcat报错 编辑:程序博客网 时间:2024/06/14 01:33
集合框架
一、集合框架概述
1、集合类的由来:
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。
集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。
备注:集合存储的是对象的地址,而不是对象本身
2、集合框架说明:
框架的顶层Collection接口和Map接口
其中Collection体系是:单列集合(集合中元素是一个值)
Map体系是:双列集合(集合中元素是一对值)
jdk1.0版本中
单列集合只有Vector,双列集合只有Hashtable,且这两个集合都是同步的,线程安全的。(Vector相当于Collection体系的先祖,Hashtabl相当于Map体系的先祖)
jdk1.2版本中
才出现Collection系列的集合,以及Map系列的集合
3、集合框架特点:
1,用于存储对象的容器。
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。
二、集合和数组的区别:
1、集合:
(1)只能存储对象的容器,不能存储基本数据类型
(2)集合长度是可变的
举例:
List list = new ArrayList();
list.add(1);//实质上是:list add(new Integer(1))
//jdk1.5版本后,执行了自动装箱操作:基本数据类型-->包装类
//备注:jdk1.4版本前,这样写是错误的。
//原因:集合中不能存储基本数据类型
list.add("abc1");//字符串String是对象,没问题
2、数组:
(1)可以存放基本数据类型和对象
备注:存放对象使用的是对象数组
eg:Person[] person=new Person[20];
(2)数组长度是固定的。
三、集合框架的构成及分类
1、集合框架构成及分类
2、集合体系说明
(1)集合框架的两大体系:Collection体系和Map体系
集合框架的两大体系:Collection体系和Map体系
Collection体系是:单列集合
Collection下有两大体系,一个是List,一个是Set
备注:Collection下还有很多其它接口,不仅仅包括List接口和Set接口
Map体系是:双列集合
因此这里主要说:List体系,Set体系和Map体系
(2)集合框架常用体系特点
集合框架常用体系:List体系,Set体系,Map体系
List体系:元素有序,并且可重复
Set体系:元素无序,并且不可以重复
Map体系:提供了一种映射关系,元素是以键值对(key-value)的形式存储的,能根据key快速查找value。其中:key值不能重复,value值可以重复;而且key对value是多(一)对一的关系【一一映射】
(3)List体系常用实现子类
List:特有的常见方法:有一个共性特点就是都可以操作角标。
List:
|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。
|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。
(4)Set体系常用实现子类
Set:元素不可以重复,是无序。
Set接口中的方法和Collection一致。
|--HashSet: 内部数据结构是哈希表 ,是不同步的。
|-- LinkedHashSet:内部数据结构是哈希表和链表,有序的
|--TreeSet: 内部数据结构是二叉树,可以对Set集合中的元素进行排序。是不同步的。
(5)Map体系常用实现子类
Map:一次添加一对元素。Collection一次添加一个元素。
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,不允许null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,允许null作为值。
|--LinkHashMap:内部结构是哈希表和链接列表实现,具有可预知的迭代顺序(有序的)
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
四、集合框架学习说明
1、弄清set集合和map集合关系
备注:
学习Set集合应该注意:Set集合的底层代码是由Map集合实现的。
为什么会有set集合?
因为:Map的集合中存储的是键值对,其中键在Map集合中是唯一的,因此将Map中的键作为set中的元素进行存储,就可以保证单列集合的唯一性了,这样就出现了没有重复元素的set集合了。
因为现实世界中因为有这样的需求,所以就有了set集合的存在
推论:
因为Set集合的底层代码是由Map集合实现的,所以set的子类xxxSet的底层实现是Map的子类xxxMap。
而我查看java的源码发现,这个推论在一定程度上是成立的。因为我发现:1)HashMap是HashSet的底层实现。2)TreeMap是TreeSet的底层实现。3)LinkedHashMap是LinkedHashSet的底层实现
(1)HashMap是HashSet的底层实现
public HashSet() {
map = new HashMap<>();
}
(2)TreeMap是TreeSet的底层实现
public TreeSet() {
this(new TreeMap<E,Object>());
}
(3)LinkedHashMap是LinkedHashSet的底层实现
public LinkedHashSet() {
super(16, .75f,true);
}
HashSet(intinitialCapacity, floatloadFactor, booleandummy) {
map = new LinkedHashMap<>(initialCapacity,loadFactor);
}
所以,学习set集合时,时刻联系map集合,注意xxxMap和xxxSet的关系,可以让自己学习集合框架更加轻松。
2、集合框架三大体系学习
集合框架List体系,Set体系,Map体系学习
List体系和Set体系都是单列集合,Map体系是双列集合。
而List体系的学习相对比较简单,而Set体系和Map体系的学习相对比较难,而Set体系和Map体系又存在联系,因为Set集合的底层代码是由Map集合实现的。所以,学会一个了一个Set(Map)体系,Map(Set)体系的内容就可以举一反三了。
(1)HashSet和TreeSet集合,它们怎样保证插入集合中的元素是唯一的?
自己在学习Set体系时,碰到比较难的地方,就是当Set体系的集合要存储自定义对象时,要自己覆盖一些方法,目的是为了:保证存入set集合中的元素都是唯一的。而这里主要说set体系下的两个子类:HashSet和TreeSet集合,它们怎样保证插入集合中的元素是唯一的?
HashSet集合解决方法:(保证插入集合中的元素唯一)
是通过对象的hashCode和equals方法来完成对象唯一性的。
只要对象覆盖了这两个方法,并在方法中写入了实现逻辑,即可解决。
情况一:当这个对象是jdk中已有的对象是,并且该对象已经覆盖了Object对象的hashCode和equals方法,比如:String对象,我们在往set集合中存储该类对象(String对象)时,无需自己给对象覆盖方法,直接使用即可。
情况二:当这个对象时自定义对象(自己写的对象),这时时,我们想要保证该对象插入set集合时,插入的对象时唯一的,我们就得给这个自定义对象添加两个方法:hashCode和equals方法,并且实现里面的比较逻辑,达到保证set集合插入该对象不重复。
TreeSet集合解决方法:(保证插入集合中的元素唯一)
TreeSet使用元素的自然顺序(字典顺序)对元素进行排序【TreeSet集合排序方式一:让元素自身具备比较功能】
或者
根据创建 set 时提供的 Comparator (比较器)进行排序,具体取决于使用的构造方法。【TreeSet集合排序方式二:让集合自身具备比较功能】
其中:
TreeSet集合排序方式一:让元素自身具备比较功能
让元素自身具备比较功能,只就需要实现Comparable接口。覆盖compareTo方法。【Comparable接口的compareTo方法】
即:自定义对象实现Comparable接口,定义排序方式,实现comparaTo方法。
TreeSet集合排序方式二:让集合自身具备比较功能
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。
当TreeSet集合有两种比较功能时,TreeSet集合排序方式二(集合自身具备比较功能)优先于 TreeSet集合排序方式一(元素本身具备比较功能)
(2)Map集合保证key(键)唯一?
Map集合保证key(键)唯一?
因为set集合的底层是通过map集合实现。
所以保证唯一,通过类比的方式得出:
HashMap(保证键唯一)与HashSet(保证元素唯一)方式一样
是通过对象的hashCode和equals方法来完成对象唯一性的。
TreeMap(保证键唯一)与TreeSet(保证元素唯一)方式一样
实现Comparable接口的compareTo方法 或者 实现 Comparator接口,覆盖compare方法
3、集合的一些技巧:
1、使用技巧
集合是存一个元素呢?还是存一对元素呢?
一个:List或者Set
一对:Map
集合存一个元素
需要唯一吗?
需要唯一:Set
需要指定顺序:
需要: TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要唯一:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList
2、如何记录每一个容器的结构和所属体系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是该集合所属的体系。
前缀名就是该集合的数据结构。
3、集合联想
看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。
而且通常这些常用的集合容器都是不同步的。
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 集合框架
- 在 CentOS 下安装使用 XWiki
- JSP页面的执行过程
- node中,已经在app中设置了跨域的问题,但是用jq的ajax请求时仍然报跨域错误
- Camera APP层分析之对camera framework层封装解析
- redis面试题总结
- 集合框架
- 猜拳游戏
- czmq编译错误zargs_t *
- 解决webgl使用canvas.toDataURL()没有内容的问题
- 文章标题
- Ubuntu17.10如何安装网易云音乐并解决无法打开
- 回溯走迷宫
- pcl点云中pcd格式点云定义详解
- 查找(时间复杂度; 二分法)