zoukankan      html  css  js  c++  java
  • HashMap底层原理

    jdk1.8之前,HashMap底层基于数组和链表。

    jdk1.8,HashMap底层基于数组+链表+二叉树(红黑树)。

    先创建数组

    Node[ ]  table = new Node[16] (散列桶初始haul)

    再创建链表对象

    tableclass Node{

    hash;    //hash值

    key;      //键

    value;         //值

    node next;     //用于指向链表的下一层(产生冲突,用拉链法)

    }

    以下是具体的put过程(JDK1.8版)

    1、对Key求Hash值,然后再计算下标

    2、如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的Hash值相同,需要放到同一个bucket中)

    3、如果碰撞了,以链表的方式链接到后面(此处碰撞个人理解为hash值相同,key值不同)

    4、如果链表长度超过阀值( TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表

    5、如果节点已经存在就替换旧值

    6、如果桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)

    下图为取值过程:

  • 相关阅读:
    css 定位
    css inline忽略宽和高
    css clear属性
    关系型数据库与nosql
    链接标签<a>的css定义规则
    1em=16px
    text-align的justify属性
    2393Cirno的完美算数教室 容斥
    bzoj4665小w的喜糖 dp+容斥
    bzoj4558[JLoi2016]方 容斥+count
  • 原文地址:https://www.cnblogs.com/wenbiquan/p/11061194.html
Copyright © 2011-2022 走看看