文章目录
一、数据结构
本部分只介绍和集合相关的数据结构:栈、队列、数组、链表、红黑树
1. 栈
- 特点: 先进后出
- 存储数据: 称为入栈,压栈
- 取出数据: 称为出栈,弹栈
2. 队列
- 特点: 先进先出
3. 数组
- 特点: 查询快,增删慢
- 查询快: 顺序存储,每一部分的地址都可以由数组地址及对应索引根据公式推出。所以,复杂度为
- 增删慢: 增删一个元素,需要进行复制操作,然后源数组被垃圾回收。所以,复杂度为
4. 链表
- 特点: 查询慢,增删快
- 查询慢: 链式存储,要确定某一元素内存地址,必须知道它的直接前节点。所以,复杂度为
- 增删快: 增删一个元素,只要将直接前置节点的指针改变一下即可。所以,复杂度为
5. 红黑数
5.1 树
5.2 二叉数
分支不能超过两个
5.3 排序树
在二叉树基础上
左子数小,右子数大
5.4 平衡树
左孩子数=右孩子数
(当然,不相等就叫不平衡树)
5.5 红黑树
特点: 相当于平衡树,查询速度非常快。查询叶子节点的最快与最慢速度之间,不能超过两倍
约束:
- 节点可以是红色的,或是黑色的
- 根节点是黑色的
- 叶子节点(空节点)是黑色的
- 每个红色的节点的子节点都是黑色的
- 任何一个节点,到其每一个叶子节点的所有路径上的黑色节点数相同
二、List接口
- 有序
- 有索引
- 元素允许重复
1. 常用方法&遍历方法
常用方法:add, get, remove, set
遍历方法:for, Iterator, foreach
注意: 注意不要索引越界异常
三、List实现类
Vector
是单列集合的共同父接口(它是Collection
的父接口),它是单列的,有自己特殊的方法。
1. ArrayList
- 底层: 数组
- 特点: 此实现不是同步的(异步,多线程)
2. LinkedList
- 底层: 链表
- 特点: 此实现不是同步的(异步,多线程)
链表的中间操作的复杂度是,二两端是,所以LinkedList
有大量针对头尾的方法
四、Set实现类
- 不能存储重复值
- 没有索引 (不能使用带索引的方法,也不能使用普通的for循环遍历)
1. HashSet
1.1 HashSet特点
- 底层是哈希表(实际为HashMap),哈希表查询的速度相当快
- 是一个无序的集合
- 允许使用null元素
从图中,我们可以看出:
- 重复的元素,未被存储(但存储时不报错)
- 遍历的顺序和存储的顺序不一致
1.2 Hash值
哈希值: 对象的地址值,是一个逻辑地址值(是模拟出来得到地址,不是数据实际存储的物理地址)是一个十进制的整数,由系统随机给出。
Object
类中有一个方法,可以得到Hash值,用法:,返回一个int值
1.2.1 哈希值的注意事项
toString
直接打印引用对象,返回的地址值,就是对哈希值进行了进制转化
2. 可以重写hashCode()
方法,String
重写了该方法
(两个一样的数组,哈希值不同)
(String
重写了hashCode()
,所以哈希值会相等。这是由于常量池的原因,如果是用new创建,也是不会相等的。)
(有个小彩蛋,重地 & 通话 的hashCode
值相等,这叫哈希冲突 )
1.3 哈希表
哈希表:
- 在
JDK1.8
之前:
- 在
JDK1.8
之后:
(链表长度超过八位,就会转为红黑树结构)
- 数组结构: 把元素进行了分组,相同哈希值是一组
- 链表/红黑树结构: 把相同哈希数值的元素链接到一起
1.4 集合不允许重复元素的原理
add()
方法会调用hashCode()
方法,计算存储元素的哈希值- 与集合中已有元素的哈希值进行比对,如果有相同的(哈希冲突),进行第3步。没有则存储。
- 新存的元素,会调用
equals()
和冲突的元素进行比较。如果不相同,存储
1.5 存储自定义对象
为了让自定义的类,能够区分重复元素,需要重写hashCode()
和equal()
方法(可以用Alt Insert
快速插入)
注: 如果不需要进行区分,就不要使用这两个方法了
可以让属性一致的多个对象hashCode一致
2. LinkedHashed
- 底层: 哈希表(数组 + 链表/红黑树) + 链表
- 链表: 用来记录顺序的链表
3. 可变参数
可以传递个参数
格式:
限制符 返回值类型 方法名(数据类型... 形参名) {
// 方法体
}
说明:
- 可变参数的底层是一个数组
- 在传入时,动态地创建一个数组
注意事项: - 一个方法的可变列表,只能有一个可变参数
- 如果有多个参数,可变参数必须在参数列表的末尾
- Demo: 计算整数和
五、Collections
Collections
是一个操作集合的工具类,提供了大量的静态方法
1. 批量添加&打乱
- addAll: 批量添加元素
Collections.addAll(集合名, 参数列表...)
- shuffle: 打乱集合中元素
Collections.shuffle(集合名)
2. sort排序(默认升序)
sort: 按照默认(升序)方法排序,只能用于list,不能用于set
Comparable
里的compareTo
方法被重写,才能进行排序(比如下图的String)
重写compareTo方法(以Person为例):
- 实现
Comparable
接口
- 重写方法(return 0 认为元素都是相同的)
升序: 调用 - 参数
降序: 参数 - 调用
3. sort(指定排序规则)
comparable
需要重写方法,相当于自己this
和别人o
的比较
Comparator
相当于找了一个裁判(第三方的规则),进行o1
和o2
的比较
可以使用一个匿名类
来指定排序规则
升序: o1 - o2
降序: o2 - o1
4. 组合排序
可以使用if来进行组合排序