1.set集合 是一个接口 底层不是数组
1.不保证元素存入顺序和取出顺序一致
2.没有索引
3.不允许重复元素
2.TreeSet : 虽然不保证存取顺序 但是能进行排序
排序的前提是 必须指定排序规则
基本数据类型对应的包装类已经重写comparable接口 所以有排序规则
自定义数据类型时候
1.自然排序 自定义类实现comparable接口 <>为集合中存储的元素类型
2.重写接口中的compareTo(Object o)
3.重新定义排序规则 this.age - o.getAge() this.age代表现在要存入集合的元素 o代表集合中已经存在的元素
4.主要排序条件和次要排序条件
当age相同时 需要进行姓名比较 result = result == 0 ? this.name.compareTo(o.getName) : result;
字符串中的compareTo方法是根据字母的码表值进行比较的
现在存入的元素 - 集合中已有的元素 < 0 存在左边
现在存入的元素 - 集合中已有的元素 == 0 需要进行次要条件比对 如果也相同为重复元素 不存
现在存入的元素 - 集合中已有的元素 > 0 存在右边
5.比较器排序
1.创建TreeSet()对象时 需要传入comparator接口的实现类对象 匿名内部类 Lambda
2.重写接口中的 compare(Object o1,Object o2)方法
o1表示现在要存入的元素 o2集合中已经存入的元素
3.必须要有主要排序和次要排序条件
result = result == 0 ? o1.getName().compareTo(o2.getName) : result;
4.什么时候自然排序 什么时候使用比较器排序?
默认使用自然排序 当自然排序不满足现有需求时 使用比较器排序进行覆盖
6.二叉树
度:子节点个数 <= 2
二叉树弊端: 查询效率非常低 需要遍历全树
二叉查找树: 左子树小于根节点 右子树大于根节点 提高了查询效率
弊端: 极端情况下依次递增 依次递减的插入元素 退化为双向链表
平衡二叉树: 每个节点的左右子树高度差不能超过1
右左 / 左右 先局部旋转 再整体旋转
弊端: 每次插入元素都有可能造成旋转 消耗性能
红黑树: 平衡二叉树 不是高度平衡的 有自己的红黑规则
1.根节点必须为黑色
2.节点要么是红色 要么是黑色
3.节点没有父节点/子节点 指向 nil 叶子节点 该节点默认黑色
4.不能出现double red
5.任意节点到叶子节点的简单路径(不能回头)上有相同数目的黑色节点
添加节点默认颜色为 红色 效率更高
7.出现double red ==> 父节点和叔叔节点 叔叔节点为红色 将 父叔节点变为黑色 祖父节点变为红色 如果祖父为根再变为黑色
出现double red ==> 父节点为红叔叔节点为黑 父和祖父节点都变为红色 已祖父节点为支点进行旋转
Set集合
最新推荐文章于 2024-03-30 21:10:29 发布