Day17 集合
- 集合
1.1 概述
Java集合是使程序能够存储和操纵元素不固定的一组数据。 所有Java集合类都位于java.util包中。
【问】:之前我们需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供Java集合工具类呢?
数组 集合
长度固定 长度不固定
存放任意类型 不能存放基本数据类型,只能存放对象的引用
我们通过对比数组和Java集合工具类来解释Java集合工具类的必要性。
数组 集合
长度固定 长度不固定
存放任意类型 不能存放基本数据类型,只能存放对象的引用
注意:如果集合中存放基本类型,一定要将其 “装箱”成对应的”基本类型包装类”。
1.2 继承体系
Collection 是集合,两个直接子接口是List和set
List 特性 : 有序 可重复,保证数据的添加顺序和取出顺序一致
Set 特性 : 无序 不可重复,不能保证数据的添加和取出顺序一致
List 有三个子类 :
ArrayList : 底层是数组,查询和更改效率极高
LinkedList : 底层是双向链表,添加和删除效率要高一些
Vector : 底层也是数组,是线程安全,已废弃,不推荐使用,已被ArrayList代替
Set有两个子类
HashSet : 底层是散列表
TreeSet : 底层是二叉树
1.3 Collection
Collection作为集合类的父类,所以,collection中的方法,是所有集合类都有的方法
1.3.1 常用方法
1.3.2 使用方式
以ArrayList为例
1.3.3 Iterator
迭代器
1.3.4 注意
1.4 forEach
1.5 List
1.5.1 ArrayList
1.5.2 LinkedList
1.5.2.1 基本使用
1.5.2.2 底层实现
1.5.2.2.1 节点类
链表由节点构成,因为是双向链表,所以节点中有三个属性
1 保存的数据 Object
2 下一个节点对象 节点类型
3 上一个节点对象 节点类型
1.5.2.2.2 LinkedList类
为了首尾添加效率更高,在LinkedList类中保存了首节点和尾结点
1.5.2.2.3 添加-add
1.5.2.2.4 获取-get
获取数据
Get方法只是模拟下标获取的方式而已,本质上就是遍历操作
只不过做了一定的判断,判断找前半截快还是找后半截快
1.6 Set和排序
1.6.1 TreeSet
1.6.2 Comparable
因为 User没有实现对应的Comparable接口,所以在使用TreeSet的时候,会报错
1.6.3 Comparator
1.6.4 List排序
1.6.5 总结
- Comparable : 如果treeSet中保存我们自己定义的类型的时候,使用Comparable
- Comparator : 如果treeSet中保存的不是我们写的类型的时候,就要使用Comparator来指定排序规则
-
比如 Integer 默认是升序排序,假如我们需要降序排序,我们只能使用 Comparator,因为我们不可能去更改Integer的源码
-
但此时 Integer中是有Comparable接口的实现的,等于两个比较都存在,但是Comparator优先级高,
-
所以会按照我们定义的规则进行排序
-
开闭原则 : 对修改关闭,对扩展开发