Java HashMap详解

前言

   HashMap作为一种高效的Map结构,已经成为了Java当中一门不可或缺的高效执行方式。

继承关系

   HashMap继承了AbstractMap,实现了Map接口,Cloneable,Serailizable接口。

基础属性

  • DEFAULT_INITIAL_CAPACITY=16
  • MAXIMUM_CAPACITY=1<<30
  • DEFAULT_LOAD_FACTOR=0.75
  • TREEIFY_THRESHOLD=8
  • UNTREEIFY_THRESHOLD=6
  • MIN_TREEIFY_CAPACITY=64

Node

  Node类实现了Map.Entry接口,里面有Key,value,hash,next节点.内部拥有这些节点的get,set方法,setValue方法传入新值,返回 旧值。

  我的理解是这样的,Node其实只是链表节点而已,一个hashmap可能有多个链表节点,因为链表的Node其实是实现了Map.Entry接口,而这个接口其实是一个内部接口的实例,里面肯定也实现了接口的方法,不过很奇怪的是,这里面用到的只是单向链表,并没有前驱节点,它的后置节点是指向链表的下一个元素。其中比较重要的方法有equals方法,只要键和值相等,并且是 Map.Entry类型,那么就可以判断这两个节点是相等的;还有一个很重要的方法是hash方法。主要用到的算法就是首先获得对象的hashcode,然后把这个hashcode无符号右移16位,并且把右移前的结果和右移后的结果按位异或,得到的hash值就是最终的结果,具体算法原因不详。

  里面还有几个不是特别重要的方法,说不是 特别重要,其实也不是真的不重要,而是这些方法一般作为外部人员来说,很少去使用。其中一个是comapreableClassFor方法,它带一个参数,从外部 传入,如果这个参数的实例实现了Comparable接口,首先判断这个是不是String类型,如果是String类型,那么直接返回 ;首先会获取带泛型的接口,如果有一个或者多个泛型接口,那么循环去便利这个数组,如果实际类型是Comparable.class,然后判断参数的实际类型,如果类型是Comparable.class,并且只有一参数,那么 返回它本身。

  里面还有一个tableSizeFor方法,参数是初始的容量,代码逻辑就是无符号的右移,每行右移的倍数就是前一次的2倍,最后右移到的是2的16次方,其中参数是初始大小 。只要 在1和MAX_CAPACITY之间就行了。

   

原文地址:https://www.cnblogs.com/kmsfan/p/7617868.html