类中定义的成员变量
transient Node<K,V>[] table; //这个数组添加数据的时候初始化。 transient int size;// map中包含健值对的数量 final float loadFactor; //map的默认加载因子
int threshold;// 下一个要调整大小的大小值(容量*加载因子) static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认指定的加载因子
//获取hash值是公用的方法
map中put元素
先判断当前Map中是否有值或者长度为0,先初始化一个 (Node<K,V>[] table)存储元素的数组 ,同时将下一个要调整容量大小的值赋值 threshold 。同时将容量初始化的大小 16(1<< 4) 赋值给一个临时变量n,下面 n-1 和这个key的hash取&, 判断这个索引是否为空,如果为空,创建一个Node (这个node实体是一个链表形式的实体)将这个Node实体赋值给取&的索引。如果存储的时候key一样,判断这个属性(onlyIfAbsent)是否为true,如果为true不修改这个key的value值,否则修改。
测试转链表的过程要hash值一样key不一样才可以走这个流程(后期测试)
map中get元素
根据key获取hash值,索引的长度-1 &上hash值获取索引的值。如果不为空,就进到下一个判断,如果为空返回null。根据索引取出来的元素&上刚才key获取的hash值,判断hash值是否一样。然后判断key是否一样。一样返回刚才索引的元素。
查漏补缺 :一文读懂HashMap_慕课手记