HashMap工作原理

HashMap数据结构

常用的底层数据结构主要有数组和链表。数组存储区间连续,占用内存较多,寻址容易,插入和删除困难。链表存储区间离散,占用内存较少,寻址困难,插入和删除容易。

HashMap要实现的是哈希表的效果,尽量实现O(1)级别的增删改查。它的具体实现则是同时使用了数组和链表,可以认为最外层是一个数组,数组的每个元素是一个链表的表头。

HashMap寻址方式

对于新插入的数据或者待读取的数据,HashMap将Key的哈希值对数组长度取模,结果作为该Entry在数组中的index。在计算机中,取模的代价远高于位操作的代价,因此HashMap要求数组的长度必须为2的N次方。此时将Key的哈希值对2^N-1 进行与运算,其效果即与取模等效。HashMap并不要求用户在指定HashMap容量时必须传入一个2的N次方的整数,而是会通过Integer.highestOneBit算出比指定整数小的最大的2^N值,其实现方法如下。

public static int highestOneBit(int i) {
  i |= (i >>  1);
  i |= (i >>  2);
  i |= (i >>  4);
  i |= (i >>  8);
  i |= (i >> 16);
  return i - (i >>> 1);
}

由于Key的哈希值的分布直接决定了所有数据在哈希表上的分布或者说决定了哈希冲突的可能性,因此为防止糟糕的Key的hashCode实现(例如低位都相同,只有高位不相同,与2^N-1取与后的结果都相同),JDK 1.7的HashMap通过如下方法使得最终的哈希值的二进制形式中的1尽量均匀分布从而尽可能减少哈希冲突。

int h = hashSeed;
h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大部分Java开发者都在使用Map,特别是HashMap。HashMap是一种简单但强大的方式去存储和获取数据。但...
    骚的掉渣阅读 799评论 0 14
  • 最近参与公司的实习生招聘工作,面试了几位实习生,我有一道每次面试都必问的题目【HasmMap的工作原理】,但很遗憾...
    竹子柳阅读 2,304评论 0 4
  • 相信大家不管是在Java还是安卓面试过程中,或多或少都会被问及HashMap的工作原理,小编今天大概看了一下And...
    cooperise阅读 898评论 1 10
  • 大成若缺,其用不弊。 大盈若冲,其用不穷。 大直若屈,大巧若拙,大辩若讷。大赢若绌。 静胜躁,寒胜热。清静,为天下...
    ai糊弄阅读 393评论 0 0
  • 2017-09-18超宇佳珥YA 这个周末, 像条咸鱼一样,近鱼者愚不是没有根据的,周六我开游戏呼唤卡特大神,连跪...
    给我一只猴子阅读 120评论 1 1