活动地址:CSDN21天学习挑战赛
1、为什么使用集合
集合与数组类似,都是容器,我们为什么不用数组而还要使用集合呢?
数组的特点:
- 数组定义完成并启动后,类型确定、长度固定。
- 不适合元素的个数和类型不确定的业务场景,更不适合做需要增删的操作。
- 数组的功能比较单一,处理数据的能力并不是很强大。
集合的特点:
- 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
- 集合非常适合应用于元素的个数不确定,且需要做增删操作的场景。
- 同时,集合提供的种类非常丰富,功能也十分强大,在开发中,集合使用的更多。
注意:
由于集合只能存储引用数据类型的数据,所以不能存储 基本类型:boolean、byte、short 、int、long、char、float、double。
倘若想使用集合对基本类型进行存储,可以使用基本数据类型对应的包装类。Boolean、Byte、Short、Integer、Long、String、Float、Double。
2、集合类体系结构
集合按照单列的双列分为两种:Collection和Map。
Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
3、Conllection集合体系
Collection集合体系主要有两种:List、Set。
Conllection API:
3.1、List
List系列集合的特点:
- ArrayList、LinekdList :有序,可重复,有索引。
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
List集合特有方法:
3.1.1、ArrayList
ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。
因为ArrayList的底层是基于数组实现的,所以它的查询快而增删元素相对较慢。
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。
3.1.2、LinkedList
LinkedList的特点:
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
3.2、Set
Set系列集合特点:
- 无序:存取顺序不一致
- 不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
Set集合实现类的特点:
- HashSet : 无序、不重复、无索引。
- LinkedHashSet:有序、不重复、无索引。
- TreeSet:排序(默认升序,若想自定义排序则需要自行设计比较规则)、不重复、无索引。
Set系列集合的功能基本上与Collection的API一致。
3.2.1、HashSet
HashSet底层原理:
- HashSet集合底层采取哈希表存储的数据。
- 哈希表是一种对于增删改查数据性能都较好的结构。
HashSet集合元素去重复的底层原理:
- 创建一个默认长度16的数组,数组名table
- 根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
- 判断当前位置是否为null,如果是null直接存入
- 如果位置不为null,表示有元素,则调用equals方法比较
- 如果一样,则不存,如果不一样,则存入数组,
结论:如果希望Set集合认为2个内容一样的对象是重复的, 必须重写对象的hashCode()和equals()方法
3.2.2、LinkedHashSet
LinkedHashSet集合概述和特点:
- 有序、不重复、无索引。
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。
3.2.3、TreeSet
TreeSet集合概述和特点:
- 不重复、无索引、可排序
- 可排序:按照元素的大小默认升序(有小到大)排序。
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
- 注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。
Treeet默认的排序规则:
- 对于数值类型:Integer , Double,官方默认按照大小进行升序排序。
- 对于字符串类型:默认按照首字符的编号升序排序。
- 对于自定义类型如Student对象,TreeSet无法直接排序。(想要TreeSet存储自定义类型,需要制定排序规则)
4、Map集合体系
Map集合概述和使用:
- Map集合是一种双列集合,每个元素包含两个数据。
- Map集合的每个元素的格式:key=value(键值对元素)。
- Map集合也被称为“键值对集合”。
Map集合整体格式:
Collection集合的格式: [元素1,元素2,元素3..]
Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
Map集合体系
说明
使用最多的Map是HashMap。
重点掌握HashMap、LinkedHashMap、TreeMap。
Map集合体系特点:
- Map集合的特点都是由键决定的。
- Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
- Map集合后面重复的键对应的值会覆盖前面重复键的值。
- Map集合的键值对都可以为null。
Map集合实现类的特点:
- HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
- LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
- TreeMap:元素按照键是排序,不重复,无索引,值不做要求。
Map集合的API:
Map集合 Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。
4.1、HashMap
HashMap的特点:
- HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
- 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
- HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。
实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
4.2、LinkedHashMap
LinkedHashMap集合概述和特点:
- 由键决定:有序、不重复、无索引。
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
4.3、TreeMap
TreeMap集合概述和特点:
- 由键决定特性:可排序、不重复、无索引
- 可排序:按照键数据的大小默认升序(有小到大)排序。只能对键排序。
- 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序 TreeMap跟TreeSet一样底层原理是一样的。
TreeMap集合自定义排序规则有两种:
- TreeMap集合自定义排序规则有2种 类实现Comparable接口,重写比较规则。
- 集合自定义Comparator比较器对象,重写比较规则。
5、List、Set、Map三种对比
List | Set | Map |
可重复 | 不可重复 | 键不可重复、值可重复 |
有序 | 无序(LinkedHashSet有序、TreeSet可排序) | 无序(LinkedHashMap有序、TreeMap可排序) |
有索引 | 无索引 | 无索引 |