源码探究Java_HashMap

Posted 南田玉彦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码探究Java_HashMap相关的知识,希望对你有一定的参考价值。

1. HashMap 定义,抽取HashMap类中主要变量,如下

public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable { 
     /** map中键值对的数量 */
     transient int size;
     /** 阀值 (阀值=加载因子*容量),达到后则扩容 */
     int threshold;
    /** 加载因子,默认0.75*/
     final float loadFactor;   
    /** 计算hash值的种子*/
    transient int hashSeed = 0; 
    /**  数组 */
    transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
    /** 链表节点定义 */
    static class Entry<K,V> implements Map.Entry<K,V> {
        /** 键名 */
        final K key;
        /** 键值 */
        V value;
        /** 后继节点 */
        Entry<K,V> next;
        /** 当前key的hash值 */
        int hash;
    }
}    

2. hash值如何计算

    final int hash(Object k) {
        int h = hashSeed;
     /** 字符串hash计算 */
if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); /**此函数确保在每个位位置仅相差常数倍的hashCodes具有有限的冲突数(默认加载因子大约为8)*/ h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }

 

3. 在上一步中查看字符串怎么计算hash值的时候发现HashMap内部的一个恶汉式的单例实现

private static class Holder {
  static final JavaLangAccess LANG_ACCESS = SharedSecrets.getJavaLangAccess();
  private Holder() {
   }

   static {
     if(null == LANG_ACCESS) {
        throw new Error("Shared secrets not initialized");
       }
   }
}

 

  

 

以上是关于源码探究Java_HashMap的主要内容,如果未能解决你的问题,请参考以下文章

java_HashMap的遍历方法_4种

Vue源码探究-事件系统

Vue源码探究-虚拟DOM的渲染

MVCC原理探究及MySQL源码实现分析

vue-router源码阅读 内部探究

AQS源码探究_01 手写一个简化的ReentrantLock可重入锁