(以下内容全部来自上述课程)
1.红黑树
增删改查性能都很好。
- 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
- 1972年出现,当时被称为平衡二叉B树。后来,1978年被修改为如今的“红黑树”。
- 它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色。
- 每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过“红黑规则”进行实现的。
1.红黑规则(看懂即可)
- 每一个节点或是红色的,或者是黑色的。
- 根节点必须是黑色的。
- 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。
- 如果某一个节点是红色的,那么它的子节点必须是黑色的(不可能出现两个红色节点相连的情况)
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包括相同数目的黑色节点。
第五条最重要了。
2.添加节点(看懂即可)
默认颜色:添加的节点默认是红色的(效率高)
照着图搞就可以了。
易错点:两个再进行判断。
2.Set系列集合
- 无序:存取顺序不一致
- 不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
Set集合的实现类:
- HashSet:无序、不重复、无索引
- LinkedHashSet:有序、不重复、无索引
- TreeSet:可排序、不重复、无索引
Set接口中的方法上基本上与Collection的API一致。
如下:
1.HashSet底层原理
- HashSet集合底层采取哈希表存储数据
- 哈希表是一种对于增删改查数据性能都较好的结构。
1.哈希表
- JDK8之前:数组+链表
- JDK8之后:数组+链表+红黑树
2.哈希值
对象的整数表现形式
- 根据hashCode方法算出来的int类型的整数
- 该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算
- 一般情况下,会重写hashCode方法(alt+insert),利用对象内部的属性值计算哈希值。
特点:
- 如果没有重写hashCode方法,不同对象计算出的哈希值是不同的。
- 如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的。
- 在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)
3.JDK8以前
数组+链表
4.JDK8以后
注意:
- JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树。
- 如果集合中存储的是自定义对象,必须要重写hashCode和equals方法。
2.LinkedHashSet底层原理
1.特点
- 有序、不重复、无索引
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理:底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。
2.细节
在以后如果要数据去重,我们使用哪个?
默认使用HashSet
如果要求去重且存取有序,才使用LinkedHashSet
3.TreeSet
1.特点
- 不重复、无索引、可排序
- 可排序:按照元素的默认规则(由小到大)排序。
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
2.默认规则
- 对于数值类型:Integer,Double,默认按照从小到大的顺序排序。
- 对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序。
3.两种比较方式
- 方法1:默认排序/自然排序:Javabean类实现Comparable接口指定比较规则。
- 方法2:比较器排序:创建TreeSet对象时候,传递比较器Comparator制定规则
- 使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种。
- 1和2同时存在,先听方式2的。
4.方法返回值的特点
- 负数:表示当前要添加的元素是小的,存左边
- 正数:表示当前要添加的元素是大的,存右边
- 0:表示当前要添加的元素已经存在,舍弃
3.使用场景
- 如果想要集合中的元素可重复
用ArrayList集合,基于数组的。(用的最多) - 如果想要集合中的元素可重复,而且当前的增删操作明显多于查询
用LinkedList集合,基于链表的。 - 如果想对集合中的元素去重
用HashSet集合,基于哈希表的。(用的最多) - 如果想对集合中的元素去重,而且保证存取顺序
用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。 - 如果想对集合中的元素进行排序
用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。