java中的基于jdk1.8的hashmap的get方法、put方法和resize扩容方法源码浅析

HashMap类成员变量释义,代码如下:


	static final int DEFAULT_INITIAL_CAPACITY = 16;//默认初始容量大小16
	static final int MAXIMUM_CAPACITY = 1073741824;//hashmap最大容量是2的30次方
	static final float DEFAULT_LOAD_FACTOR = 0.75F;//默认加载因子
	static final int TREEIFY_THRESHOLD = 8;//当同一个槽位的链表的长度大于8时,转成红黑树,查询效率更高
	static final int UNTREEIFY_THRESHOLD = 6;//树大小为6,就转回链表
	static final int MIN_TREEIFY_CAPACITY = 64;//数容量最小64
	transient Node<K, V>[] table;//哈希桶数组,真正存放键值对的数据结构
	transient Set<Map.Entry<K, V>> entrySet;
	transient int size;//表示保存的键值对数量
	transient int modCount;//HashMap被改变的次数,扩容的次数
	int threshold;//阈值,当size大小大于这个数进行扩容,threshold = 容量*加载因子
	final float loadFactor;//加载因子实际大小

put方法,代码如下:

public V put(K paramK, V paramV) {//onlyIfAbsent表示是否替换原值
//参数evict我们可以忽略它,它主要用来区别通过put添加还是创建时初始化数据的
		return (V) putVal(hash(paramK), paramK, paramV, false, true);
	}
final V putVal(int paramInt, K paramK, V paramV, boolean paramBoolean1, boolean paramBoolean2) {
		Node[] arrayOfNode;
		int i;
//如果表table不存在或者空表,进行初始化一个表出来,
		if (((arrayOfNode = table) == null) || ((i = arrayOfNode.length) == 0)) {
//resize()不仅用来调整大小,还用来进行初始化配置
			i = (arrayOfNode = resize()).length;
		}
		int j;
		Object localObject1;
//判断在(j = i - 1 & paramInt)位置是否有元素,没有则进行直接创建node节点进行保存键值对
		if ((localObject1 = arrayOfNode[(j = i - 1 & paramInt)]) == null) {
			arrayOfNode[j] = newNode(paramInt, paramK, paramV, null);
		} else {//如果在(j = i - 1 & paramInt)位置有值
			Object localObject3;
			Object localObject2;//把带插入的元素赋值localObject2,用来查看是不是待插入的元素已经有了,有就替换
//当前元素hash值和参数paramInt相等,并且当前元素key值和参数paramK相等,表示要插入的元素就是当前元素,说明要插入的已经存在,则进行当前元素值替换,即修改当前元素value值
			if ((hash == paramInt)
					&& (((localObject3 = key) == paramK) || ((paramK != null) && (paramK.equals(localObject3))))) {
				localObject2 = localObject1;//要插入的元素就是localObject1,localObject1已经存在,把它赋值给localObject2,方
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值