> 科技
hashmap的hash碰撞(hashmap碰撞问题)
导语:HashMap hash碰撞之后
1、hash碰撞代码import java.util.HashMap;public class MapMain { public static void main(String[] args) { HashMap<Integer , Integer> map = new HashMap<>(); //都是放入数组下标为1的位置 map.put(1 , 1); map.put(17 , 17); }}
2、进入put方法public V put(K key, V value) { //进行hash计算后进入put方法 return putVal(hash(key), key, value, false, true);}
3、进入putVal方法final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i; // 得到n = 16 , hashmap初始化的大小if ((tab = table) == null || (n = tab.length) == 0) //省略 Node<K,V> e; K k; //循环 for (int binCount = 0; ; ++binCount) { //p= Node<1,1> , next = null ,当前的节点就是尾节点 if ((e = p.next) == null) { //将新的节点插入Node<1,1>后面, 证明采用尾插法 p.next = newNode(hash, key, value, null); //判断当前链表数量是否大于8 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st //进行树生成逻辑 treeifyBin(tab, hash); //插入尾部直接结束 break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } //2 ++modCount; return null;}
总结:从源码看,hash碰撞之后如采用的是尾插法
为什么采用尾插法呢?
因为HashMap的hash出现碰撞冲突后,需要遍历链表进行Key的比较,出现Key值一样需要进行覆盖,所以用尾插法可以理解,因为反正都要遍历完冲突的链表的。
本文内容由快快网络小璎创作整理编辑!