HashMap的底层实现原理

      HashMap是最常用的Map接口的实现类型,通过存储键值对的方式,来表示两个集合的映射关系。

一、构造方法

HashMap有四个构造方法

  1. HashMap()                                                        //无参构造方法

  2. HashMap(int initialCapacity)                            //指定初始容量的构造方法

  3. HashMap(int initialCapacity, float loadFactor) //指定初始容量和负载因子

  4. HashMap(Map<? extends K,? extends V> m) //指定集合,转化为HashMap

HashMap默认初始容量为16,HashMap的扩容十分耗时,如果能提前知道容量尽量提前设置。扩容时会将容量翻倍。

二、数据结构

HashMap的主要数据结构是哈希表,用“拉链法”实现。

哈希表是一组链表的数组。以内置静态类Entry作为结点,Entry的属性有 hash,key,value,next

通过Entry.next将所有Entry连接成链表

哈希表通过类型K的内置函数hashCode(),根据这个函数和容量len,可以直接确定查找值所在位置,而不需要一个个比较。这样就Entry所在的位置,直接找到数据,提升效率。

三、函数实现

1.get(K key)

首先要寻找key的Entry,计算key.hashCode()%len,得到index,那么就在Entry[index]所在的链表中找到对应key相等的Entry,然后返回Entry中的value即可,如果没找到则返回null

2.put(K key,V value)

计算key.hashCode()%len,得到index,遍历Entry[index]如果找到对应的key,替换上新的value并返回原来的value。否则调用addEntry(hash,key,value,index),即给链表添加新的Entry结点

三、后记

在Jdk1.8中,引用了红黑树,进一步提高了HashMap的效率,HashMap的实现方式做了一些改变,数据结构的存储由数组+链表的方式,变化为数组+链表+红黑树的存储方式,但是基本思想没有改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值