HashMap笔记

您所在的位置:网站首页 hashmap的存储方式 HashMap笔记

HashMap笔记

2024-07-09 13:46| 来源: 网络整理| 查看: 265

本篇是HashMap笔记第二篇,在上一篇中分析了HashMap的底层结构,让我们对HashMap有了一个整体印象,在这一篇文章中,我将重点分析HashMap如何通过索引存储及获取数据。

一. HashMap的索引计算方法

HashMap通过put(key,value)来执行存储数据操作,通过get(key)来获取数据,而在这过程中存储的索引是非常重要的,它相当于一个坐标,有了它,就能保证我们在使用hashMap操作时的准确性。

假如调用hashMap.put(“money”,1000)方法,将会在HashMap的table数组中插入一个key是"money"的元素;这时需要通过hash()函数来确定该entry的具体插入位置,而hash()方法内部会调用hashCode()函数得到"money"的hashCode;然后putVal()方法经过一定计算得到最终的插入位置index,最终将这个entry插入到table的index位置。

key的hash值计算是通过hashCode的高16位异或低16位实现的:

h = (key.hashCode()) ^ (h>>16)

使用位运算代替了取模运算,在table的长度比较小的情况下,也能保证hashCode的高位参与到地址映射的计算当中,同时不会有太大的开销。

在这里插入图片描述

图一.hashCode计算得到索引过程

HashMap put方法详解

在这里插入图片描述

图二.put添加方法执行流程

通过上面的流程的流程图,我门就可以非常清晰的看到HashMap方法的执行流程:

1.判断数组table是否为null,若为null则执行resize()操作。

2.根据键key的值计算hash值得到插入的数组索引i,若table[i] == null;则直接新建节点插入,进入步骤6;若table[i]非null,则继续执行下一步。

3.判断table[i]的首个元素的key是否和当前key相同(hashCode和equals均相同),若相同则直接覆盖value,进入步骤6,反之则执行下一步。

4.判断table[i]是否是treeNode,若是红黑树,则直接在树中插入键值对并进入步骤6,反之执行下一步。

5.遍历table[i],判断链表长度是否大于8,若>8,则把链表转换成红黑树,在红黑树中执行插入操作;若



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3