HashMap底层实现原理

1、存储结构

   JDK1.8之前 HashMap = 数组(O(1))+ 单向链表(O(n))
   JDK1.8之后 HashMap = 数组(O(1))+ 单向链表(O(n))+ 红黑树(O(log n)

2、原理
    HashMap是基于hashing的原理,我们使用put(key,value)存储对象到HashMap中,使用get(key)从HashMap
    中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于
    找到bucket位置来存储Entry对象。(关键点:HashMap是在bucket中存储键对象和值对象,作为Map.Entry)

3、hash碰撞(两个对象的hashCode相同)
    因为hashCode相同,所以它们的bucket位置相同,会发生'碰撞';因为HashMap使用链表存储对象,这个Entry
    对象会存储在链表中。
    
4、两个键的hashCode相同,如何获取值对象
    当调用get()方法时,HashMap会使用键对象的hashCode找到bucket位置,然后调用keys.equals()方法去找到
    链表中正确的节点,最终找到值对象。
    
5、如果HashMap的大小超过了负载因子定义的容量,怎么办?
    默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket的时候,将会创建原来HashMap大小的两倍
    的bucket数组,来调整map的大小,并将原来的对象放入新的bucket数组。
    (HashMap默认的初始化大小是16,扩容至原来的2倍;ArrayList默认的初始化大小是10,扩容为原来的1.5倍)
    
注意:重新调整HashMap大小可能产生条件竞争;另外使用String,Integer这样的final修饰的对象作为键是非常合适
    的,因为它是不可变的,并且重写了equals()和hashCode()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值