搜索
写经验 领红包
 > 科技

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值一样需要进行覆盖,所以用尾插法可以理解,因为反正都要遍历完冲突的链表的。

本文内容由快快网络小璎创作整理编辑!