博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap
阅读量:6588 次
发布时间:2019-06-24

本文共 1183 字,大约阅读时间需要 3 分钟。

  hot3.png

HashMap的数据结构是散列表,首先通过hash值判定数据保存在数组中哪个节点,再通过链表把hash值相同的数据放到数组同一坐标。

输入图片说明

关键点一 确定数据存放位置

##计算key的hash code java 7 版本

final int hash(Object k) {        int h = hashSeed;        if (0 != h && k instanceof String) {            return sun.misc.Hashing.stringHash32((String) k);        }        h ^= k.hashCode();        // This function ensures that hashCodes that differ only by        // constant multiples at each bit position have a bounded        // number of collisions (approximately 8 at default load factor).        h ^= (h >>> 20) ^ (h >>> 12);        return h ^ (h >>> 7) ^ (h >>> 4);    }

位移计算目的是让key的hashcode分布更均匀,更松散的放到数组中。

##确定存放在数组的位置 java 7 版本

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16......static int indexFor(int h, int length) {        return h & (length-1);    }

我注意到Hashcode的初始化数组长度是16,这儿数字不是随意定的。我把indexFor方法分解成位运算会一目了然。 我们假设h=1,length是默认长度16。计算过程是: 16-1=15,位的变化是:10000 -> 1111。1 & 15 的二进制计算入下

0001 & 1111------  0001

结果是1,作为对比,如果如果长度不是16而是14,那么14-1=13,1 & 13 的二进制计算入下

0001 & 1101------  0001

结果一样,但是我们会发现,如果长度为14,“1101”的第2位的计算结果永远都会是0,也就是永远有一部分空间闲置不会被利用。

为了避免这种情况,所以初始化的长度是16(位2的n次方)。 如果我们要制定初始化大小,最好也遵循这个规律。

转载于:https://my.oschina.net/MrW/blog/630956

你可能感兴趣的文章
mysql的配置文件适用5.6与5.7
查看>>
关于我小孩的教育意见
查看>>
我的友情链接
查看>>
c语言指针跨函数使用内存
查看>>
词法分析与语法分析简介
查看>>
JS中的默认行为
查看>>
我的友情链接
查看>>
sersync实时备份安装及设置
查看>>
Linux与云计算——第二阶段Linux服务器架设 第七章:网站WEB服务器架设—日志分析平台...
查看>>
基于SSM的作业调度平台-java作业调度平台
查看>>
数据库基础应用
查看>>
运维第五单元
查看>>
Checkio代码闯关小计
查看>>
十月份个人考核
查看>>
用AWK来过滤nginx日志中的特定值~~~
查看>>
Purism释出Librem 5智能型手机新进展
查看>>
如何在Mac OSX系统下安装Tomcat
查看>>
Linux的基础命令和配置文件
查看>>
网络工程师成长日记368-榆林通信大楼项目回忆录
查看>>
WHY TELECOM FIELD ENGINEERS NEED TO ACCEPT FREELANCE LIFE
查看>>