zoukankan      html  css  js  c++  java
  • jdk1.8HashMap

    JDK1.8中HashMap实现

    img

    JDK1.8中的HashMap实现跟JDK1.7中的实现有很大差别。下面分析JDK1.8中的实现,主要看put和get方法。

    img

    img

    构造方法的时候并没有初始化,而是在第一次put的时候初始化

    img

    putVal方法的主要逻辑是这样的:

    1、如果数组还没有初始化(数组长度是0),则先初始化

    2、通过hash方法计算key的hash值,进而计算得到应该放置到数组的位置

    3、如果该位置为空,则直接放置此处

    4、如果该位置不为空,而且元素是红黑树,则插入到其中

    5、如果是链表,则遍历链表,如果找到相等的元素则替换,否则插入到链表尾部

    6、如果链表的长度大于或等于8,则将链表转成红黑树

    img

    1、计算hash求位置

    2、看第一个元素是不是要找的,是则返回,否则遍历

    img

    扩容就是将旧数组的元素移动到新数组

    总结:

    1、HashMap底层是用数组+双向链表+红黑树实现的

    2、插入元素的时候,首先通过一个hash方法计算得到key的哈希值,进而计算出待插入的位置

    3、如果该位置为空,则直接插入(包装成Node)

    4、如果该位置有值,则依次遍历。比较的规则是,hash值相同,key值相等的元素视为相同,则用新值替换旧值并返回旧值。

    5、如果该位置的元素是红黑树结构,则同理,查找,找到则替换,没找到则插入。

    划重点:

    JDK1.8中HashMap与JDK1.7中有很多地方不一样

    1、1.8中引入了红黑树,而1.7中没有

    2、1.8中元素是插在链表的尾部,而1.7中新元素是插在链表的头部

    3、扩容的时候,1.8中不会出现死循环,而1.7中容易出现死循环,而且链表不会倒置

    来源:https://www.cnblogs.com/cjsblog/p/8207211.html

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可评论咨询.
  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/Dean0731/p/14588444.html
Copyright © 2011-2022 走看看