JDK1.8中HashMap的源码分析
关键的属性分析
public class HashMap
构造函数的分析,HashMap提供了四个构造函数
//创建一个指定容量和指定负载因子的HashMap public HashMap(int initialCapacity, float loadFactor) {//这三个判断是看初始容量大小的 , 最大不能超过MAXIMUM_CAPACITY=1<<30(2的30次方)if (initialCapacity < 0)throw new IllegalArgumentException("Illegal initial capacity: " +initialCapacity);if (initialCapacity > MAXIMUM_CAPACITY)initialCapacity = MAXIMUM_CAPACITY;if (loadFactor <= 0 || Float.isNaN(loadFactor))throw new IllegalArgumentException("Illegal load factor: " +loadFactor);this.loadFactor = loadFactor;this.threshold = tableSizeFor(initialCapacity);}//传入默认的容量大小 , 创造一个指定容量大小和默认负载因子是0.75 HashMap,这个构造函数其实也是调//用的第一个构造函数public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);}//此构造函数创建一个空的HashMap , 其中加载因子为默认值0.75 public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}//该构造函数 , 传入一个Map然后把该Map转为HashMap public HashMap(Map extends K, ? extends V> m) {this.loadFactor = DEFAULT_LOAD_FACTOR;//将一个老的map添加到这个新的map中putMapEntries(m, false);}final void putMapEntries(Map extends K, ? extends V> m, boolean evict) {int s = m.size();if (s > 0) {if (table == null) { // pre-sizefloat ft = ((float)s / loadFactor) + 1.0F;int t = ((ft < (float)MAXIMUM_CAPACITY) ?(int)ft : MAXIMUM_CAPACITY);if (t > threshold)threshold = tableSizeFor(t);}else if (s > threshold)resize();for (Map.Entry extends K, ? extends V> e : m.entrySet()) {K key = e.getKey();V value = http://kandian.youth.cn/index/e.getValue();putVal(hash(key), key, value, false, evict);}}}
添加元素 , 在看添加方法之前 , 我们先看下 hash()方法 , 怎么计算的hash值
static final int hash(Object key) {int h;//先取key的hashCode , 然后进行位运算 , 再进行异或运算 , 这么复杂目的是为了减少hash碰撞return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
下面是put方法
public V put(K key, V value) {//四个参数 , 第一个hash值 , 第四个参数表示如果该key存在值 , 如果为null的话 , 则插入新的//value,最后一个参数在hashMap中没有 , 可以不用管return putVal(hash(key), key, value, false, true);}
【JDK1.8中HashMap的源码分析】然后进入putVal方法中
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {//定义了四个变量 , tab哈希数组;p该哈希桶的首节点;n hashMap的长度;i计算出数组下标Node
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 国外|坐拥77件专利,打破国外的垄断,造出中国最先进的家电芯片
- 手机基带|为了5G降低4G网速?中国移动回应来了:罪魁祸首不是运营商
- 通气会|12月4~6日,2020中国信息通信大会将在成都举行
- 中国|浅谈5G移动通信技术的前世和今生
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- Blade|售价2798元 中兴Blade 20 Pro 5G手机发布 骁龙765G配四摄
- 健身房|乐刻韩伟:产业互联网中只做单环节很难让数据发挥大作用
- 垫底|5G用户突破2亿:联通垫底,电信月增700万,中国移动有多少?
- 计费|5G是如何计费的?