简易版的HashMap实现

本文介绍了简易版HashMap的实现过程,包括其基本原理——数组加链表(1.7前)或数组加红黑树(1.8后)。文章详细讨论了为何HashMap的长度为2的整次方,以及负载因子对扩容的影响。文中还提供了成员变量的定义,如数组、size和hash方法,并实现了put和get操作。最后,进行了测试以验证简易HashMap的功能。
摘要由CSDN通过智能技术生成

简易版的HashMap实现

我们在工作中经常需要使用到HashMap, 但是你了解它的一个工作原理吗?
今天我来实现一个简易版的HashMap

写代码之前先来了解一下HashMap的一个基本原理
首先HashMap的一个基本数据结构, 就是一个数组加链表, 当然,这是1.7之前的结构, 1.8之后, 当链表的长度超过8或等于8之后会转换成红黑树, 可以通过源码可以看出

for (int binCount = 0; ; ++binCount) {
   
                    if ((e = p.next) == null) {
   
                        p.next = newNode(hash, key, value, null);
                        //(这里这个判断, 会转红黑树)
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st  
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }

这个是用来判断的常量值

 static final int TREEIFY_THRESHOLD = 8;  

开始写代码了

1.成员变量部分
前文说了, HashMap是数组, 那我们是不是可以先定义一个数组呢 ? 这个数组存储什么对象呢?
HashMap是一个key-vlaue的结构, 是不是定义一个对象来表示呢? 这个要有什么呢? key, value肯定要有, 如果产生hash碰撞, 是不是要有链表呢?

    /**
     * 自定义hashmap的数据结构
     * @param <K>
     * @param <V>
     */
    class Entry<K, V> {
   <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值