ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### HashMap > 主体是一个数组 Node<K,V>[] table, 每个元素初始是一个Node, [链表方式 / 红黑树] #### key hash计算方法 > 高16位与低16位的异或(相同为0,不同为1): hash ^ hash >>> 16 #### 保存方法 > HashMap可以接受null键值和值, hash取模计算bucket: (length - 1) & hash #### hash碰撞 > 如果hash相同,必须要通过== 或者 equals 比较值, > 如果值不同,如果是链表,直接放到后面即可 > 如果是红黑树,还需要需要调用*System.identityHashCode*计算未重写的hash值进行比较,来找到在红黑树的位置 > 所以使用值对象,应为是final类,所以hashCode方法不能被重写,不易发生hash碰撞 #### 变换存储结构 > 当单个节点的存储数量超过8个的时候会触发转化为红黑树(前提是map的size 大于64,如果是小于64的,会优先扩容) #### 扩容 > 由于扩容一定是 * 2的方式,所以原来的每个值,要么还在当前节点,要么在节点+length的位置.