yangyang12138

导航

HashMap

java 中hashmap是以一致性hash算法基础实现的一个map,hash算法就是散列表算法,

hash表的存取都是常数阶。算法本身我就不多说了,我就说说java中的HashMap对象,

它是一个hash表算法实现的,hash表是以bucket元素的一个数组,这个数组的长度必须严格设定,因为它关系到碰撞率

什么是碰撞率那,首先HashMap内维护一个很大的数组,每个数组是一个bucket,bucket中是一个链表,链表中的元素是一个Entry

Entry是一个键值对,包含一个key和一个value,

put(key,value)函数的操作就是通过获得key的hashCode,也就是Object的hashCode函数,这个返回值是一个int值,这个int值并不是直接作为数组的位置,

它要经过一个一元运算, f(x)=ax+b 。这个函数大家都应该清楚,它的定义域就是所有的hashCode值,值域就不一定,它取决于a的大小,如果a大于1它的值域会比定义域还大

但是这根本没有意义,如果小于1值域就会小于定义域,就会有多个定义域的值落在同一个值上,这就是碰撞

就是两个entry获得的位置是同一个位置,显然a越大,碰撞几率越小,想法碰撞几率越大,如果a=1,就不存在的碰撞的可能,因为hashCode本身就是一个唯一值。

对于碰撞时怎么处理的哪,就是将碰撞的对象用一个链表存起来。

当取一个对象时,先根据key获得hashCode计算出这个位置,如果bucket里的entry只有一个,如果entry有多个,就要采用equals函数,比较计算出要获得的对象

posted on 2017-09-17 03:09  杨杨09265  阅读(112)  评论(0编辑  收藏  举报