概念
-
输入为无限的值 输出为有限集合
-
特点 : 可重复、不可逆
所以说
3.输入不同 但是得到的哈希值可能相同;(哈希值相同,会被分到同一个数组位置,所以还需要equals相同才能判断是同一个对象;一个链表上的node的key 大部分的hash值都是不同的)
1的平方=1
-1的平方=1
不同的值通过同一重算法可能会获得到相同的结果,所以有结果不一定能推测到原始值。
4.哈希值不同,有可能得到相同的hashmap的数组下标
5.相同的输入会有相同的输出
6.对象头中的hashcode 只有在调用hashcode()方法的时候才会产生
为什么重写equals方法必须重写hashCode方法 重点 (hashmap.put方法的源码)
java HashMap插入重复Key值问题_java map put相同的key-优快云博客
HashMap
jdk1.7中 HashMap 由“数组+链表”组成(也就是老杜讲的)

jdk1.8中 HashMap 由“数组+链表+红黑树”组成
(91条消息) HashMap的put方法_青鸟Will的博客-优快云博客
这个人的78有点小问题
Redis Cluster数据分片
Redis Cluster数据分片实现原理、及请求路由实现-优快云博客
Redis Cluster采用虚拟哈希槽分区而非一致性hash算法,预先分配16384(2^14)个卡槽,所有的键根据哈希函数映射到 0 ~ 16383整数槽内,每一个分区内的master节点负责维护一部分槽以及槽所映射的键值数据。
树
二叉(搜索/查找)树、 AVL(平衡二叉树)、红黑树、B-Tree、B+Tree
-
二叉(搜索/查找)树
下图老杜讲的 老杜说TreeSet/Map是平衡二叉树 但是他画的图是不平衡的二叉树,就是普通的二叉树

下图是宋老师的课件

-
AVL(平衡二叉搜索树)
在上面的基础上 规定了左子树和右子树的高度差不得超过1


3、 B-Tree
4、 B+
5、 红黑树 (是非严格的2) 暂时没看懂
红黑树(RBTree):是一种非严格平衡的二叉查找树,即不完全符合左右子树的高度差最大为1这个条件,通过引入节点颜色来降低旋转次数
AVL树:是一种严格平衡的二叉查找树,即严格遵循左右子树的高度差最大为1这个条件
5.1红黑树规定了:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。也就是说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
5.2旋转
AVL树和红黑树的插入和删除操作都需要通过树的旋转来维持平衡。
5.3性能
(1)查询性能 红黑树(RBTree)和AVL树对比_grey红树vw vlw vllw-优快云博客
红黑树的查询性能略逊于AVL树,因为RBTree比AVL树不平衡最多多出一层,即拥有相同内容的二叉树,RBTree查询比AVL树查询最多多一次比较而已,因此查询性能上略逊于AVL树
(2)插入和删除节点
插入:一个节点的插入RBTree和AVL树都需要最多两次旋转操作保持平衡,即复杂度都是O(1)
删除:一个节点的删除,RBTree最多三次旋转操作保持平衡,复杂度是O(1),而AVL树需要维护被删节点到根节点路径上的所有节点的平衡性,需要做大量的旋转操作来达到平衡性,复杂度是O(logN)
综上所述:RBTree比AVL树的插入和删除效率要高很多
ConcurrentHashMap

syn的偏向锁
当一个对象已经计算过 hashCode,就再也无法进入偏向状态了
有点诡异 可以理解为 没有地方放 threadid、epoch