数据哈希值的计算和在table半岛体育- 半岛体育官方网站- APP下载中的存储位置

2025-07-10

  半岛,半岛体育,半岛体育app,半岛官网,半岛电竞,半岛真人,半岛棋牌,半岛体育官网注册,半岛体育官方app下载,半岛体育app下载,半岛体育怎么样,半岛体育官网,半岛体育登录入口,半岛体育官方网站

数据哈希值的计算和在table半岛体育- 半岛体育官方网站- 半岛体育APP下载中的存储位置

  我们知道,Objects中定义了hashcode()函数,用于计算对象的哈希值。并且在很多类中都对hashcode()函数进行了覆盖。但是在HashMap中并没有直接使用各个类的hash值,而是使用hash()函数将它再次进行了计算。

  重新计算的哈希值是用hashCode()计算出的哈希值和它自己左移16位之后的数进行异或

  哈希值是32位的二进制数,我们可以看出,将哈希值右移16位正好是32bit的一半,也就是说它将自己的高16位和低16位做异或,那么当table数组的长度较小的时候,哈希值的高位也能参加数组位置的计算

  在HashMap是什么一节中我们看到table的阈值并不一定是我们自己设定的容量×加载因子,而是经过了tableSizeFor()函数的计算,那么这个函数又是什么

  首先,我们这样做的目的是为了找出大等于用户给出的哈希表的容量的最小的2的幂,比如用户给了7,那我们就要找到8,用户给了14,我们就要找到16. 那为什么通过这种方式就可以找到呢?让我们来看

  假设我们要寻找的数是离14最近的且大于它的2的幂,明显这个数是16,为2的4次方

  可以这样想,我们想利用14计算出16,那我们可以先计算出15,再加一,而15有一个特点那就是它有四个1,那现在的问题就成为了如何让14从它的第一位非0数开始将后面的数字全部转换成1.

  首先14和15的第一位非0数在同一位上,也就是说我们不用管后面的数,只需要管后面的数。那有什么方法可以让所有的数都转换为1呢,那就是和1进行或运算。

  -1是为了防止若用户给的数本身就是2的幂,如16,那么将16-1后依旧//可以利用下面的方法计算出想要的结果而不会出错

  从举得例子来看,当n做第一次或运算后,n的前两位都转换为了1,那么现在就可以利用前两位将3,4,位转换为1,所以第二次与运算将n右移了两位;同理,进行了第二次运算后,n的前四位都已经是1了可以用它们去改变5,6,7,8位,后面同理。这就是为什么是以1,2,4,8,16的顺序右移。那为什么到右移16位后就停止了呢?

  int在java中是4个子节 即32位,而向右移动16位后,可以从高位第一个出现1的位置开始向右连续32位为1,已经超越了int的最大值,所以不用在进行位移操作了

  这是putVal函数中的一小段代码。我们发现,在数组中的位置是用n-1和hash做与运算得到的

  在做与运算时,任何数和0与都会成为0,那么这样就可以保证与运算的结果在0~n-1之间,即数组下标的范围,不会发生数组越界

地址:半岛体育永久网址【363050.com】 客服热线:363050.com 传真:363050.com QQ:363050.com

Copyright © 2012-2025 半岛体育网站 版权所有 非商用版本