HashMap总结

 

  • hashMap的内部结构 (java8):数组+链表+红黑树
  • hashmap put方法 流程

  • hashmap内部数组结构图

  • 面试题
    • 问题你知道HashMap的工作原理吗?
      • 回答 :HashMap的底层实现是数组+链表+红黑树 ,通过put 和get方法存储和获取对象,
        • 存储对象的时候,把key和value传递给put方法 ,他调用hashcode计算hash得到bucket的位置,然后判断table[i]是否等于null ,若是null 直接进行存储,若不是null 就判断key 是否存在,若存在就进行覆盖,不存在,判断是否是treenote,不是就遍历链表进行存储,若是就进行红黑树的存储,HashMap会根据当前的bucket的占用情况自动调整容器的大小(超过local Factor则resize为原来的两倍)
        • 获取对象的时候 ,传递key 给get方法,然后调用hashcode的hash方法获取bucket的位置,并进一步调用equals方法确定键值对,若是数组直接取出元素,若是链表进行链表的操作获取元素,若是红黑树,进行红黑树操作获取元素
    • 问题:你知道get和put的原理吗
      • 通过key的hashcode方法进行hash ,并且计算(n-1&hash),获取backet位置,若是产生碰撞,则利用key.equals()方法去链表或红黑树中查找元素
    • 问题 :你知道hash的实现吗 ?为什么要这样实现?
      • java8的实现,是通过hashcode的高16位异或低16位实现的(h = k.hashCode()) ^ (h >>> 16),主要是从速度,效率,质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。
    • 问题 :. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
      • 如果超过了负载因子(默认0.75),则会重新resize一个原来长度两倍的HashMap,并且重新调用hash方法。(注意:我们在扩充HashMap的时候,不需要重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”。)
      • HashMap扩容

    • 问题:说一下你对 HashMap 的了解
      • HashMap 底层是数组 + 单链表 + 红黑树 组成的存储数据结构,简单来说当链表长度大于等于 8 并且数组长度大于 64 那么就会由链表转为红黑树,当红黑树的大小容量 <= 6 时又转换为 链表的一个底层结构。非线程安全的。

    •  
  • 参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值