HashMap集合
HashMap集合概述和特点
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键存储的是自定义对象,需要重写hashCode和equals方法
哈希表结构
-
JDK1.8以前
哈希表由数组+链表组成
-
JDK1.8以后
-
节点个数少于等于8个
数组+链表 组成 -
节点数多于8个
数组+红黑树 组成
数组
数组的存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;
链表
链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入删除容易。
红黑树
- 红黑树特点
1、平衡二叉B树
2、 每一个节点可以是红或者黑
3、 红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则”实现的 - 红黑树的红黑规则有哪些
1、每一个节点或是红色的,或者是黑色的
2、根节点必须是黑色
3、如果一个节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
4、如果一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点想练的情况)
5、对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
- 红黑树节点的默认颜色
添加节点时,默认为红色,效率高
- 红黑树添加节点后如何保持红黑规则
- 若红黑树添加的节点位置为根节点,则根节点直接变为黑色;
- 非根节点位置
1、若父节点为黑色,不需要任何操作,默认红色;
2、若父节点为红色,并且叔叔节点也为红色,将“父节点”设为黑色,将“叔叔节点”设为黑色,将“祖父节点”设为红色,如果“祖父节点是根节点”,将根节点再次设为黑色;
3、若父节点为黑色,叔叔节点为黑色, 将“父节点”设为黑色,将“祖父节点”设为红色,以“祖父节点”为支点进行旋转。
哈希值
- 哈希值简介
是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 - 如何获取哈希值
Object类中的public int hashCode():返回对象的哈希码值 - 哈希值的特点
1、同一个对象多次调用hashCode()方法返回的哈希值是相同的
2、默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同