所谓hash,实际上就是散列,音译为哈希,就是通过散列算法,将输入转换为固定长度的输出,详情点击传送门

HashMap

1.创建hashMap时,可以指定创建长度和负载因子的map(其中负载因子,指的是已经使用存储空间与实际存储空间的比值,比值越大,节省空间,但是搜寻速度会变慢,过小,浪费空间,但是搜寻速度快,默认值 为0.75)

HashMap、HashTable、HashSet详解

2.查看hashMap的put方法的源码实现

HashMap、HashTable、HashSet详解

下图为确定hashCode在数组table中的索引位置,非常巧妙,当length总为2的次方时,假设 h=5,length=16, 那么 h & length - 1 将得到 5;如果 h=6,length=16, 那么 h & length - 1 将得到 6 ...    从而确定在数组中的位置

HashMap、HashTable、HashSet详解

该源码体现了,hashMap中是允许存在空的键值,循环中,解决了当存在相同hashCode出现hash碰撞时的解决方法,并对存在键的旧值替换为新值,所以hashMap中不能存在重复键

小结:a.hashMap中是允许存在空的键值

         b.hash碰撞时,通过实体链存储进行解决

         c.hashMap中不能存在重复键

3.hashMap中对空键的处理putForNullKey方法

HashMap、HashTable、HashSet详解

4.hashMap中的get方法

  下图为get方法中调用的getEntry方法

HashMap、HashTable、HashSet详解

5.hashMap对于resize表数组的处理

HashMap、HashTable、HashSet详解

HashMap、HashTable、HashSet详解

resize时必须进行位置的重新计算,不然不能找到准确的数据

与hashTable的区别

A.hashTable中缺省为synchronized,同步的,线程安全

B.由上可得出,hashMap可以存在空的键值,(判断hashMap中是否存在一个键只能使用containsKey,不能使用get),hashTable不允许存在空的键值

对于hashSet

hashSet底层的实现就是采用的hashMap,只是进行了一次封装,将数据存到key中,value存入的是PRESENT,就是一个Object

HashMap、HashTable、HashSet详解

HashMap、HashTable、HashSet详解


参考自:http://blog.csdn.net/bear_wr/article/details/52275874

相关文章:

  • 2021-05-07
  • 2021-06-13
  • 2021-10-12
  • 2022-03-04
  • 2021-11-06
  • 2021-10-26
猜你喜欢
  • 2021-11-26
  • 2021-10-03
  • 2021-06-24
  • 2021-04-06
  • 2021-10-08
  • 2021-07-20
  • 2021-06-14
相关资源
相似解决方案