HashMap是如何进行扩容的?
HashMap通过resize()方法进行扩容。
源码解析:



resize()函数有两种使用情况:
一、当table数组为null时初始化hash表。

二、当table数组不为null时进行扩容。
1、如果table数组的容量超过最大容量时,无法扩容,直接返回旧的数组。并将threshold值设置为Integer.MAX_VALUE(2^31-1),
2、如果table数组的容量扩展为原来的2倍时仍没有超过最大容量且table数组原来的长度已经大于默认的初始容量时,将threshold扩大为原来的2倍。
3、将旧数组中的节点转移到新的数组中去
1)、如果旧数组中的头节点不为null且头节点没有下一个节点,则先将旧数组置空,再计算该节点在新数组的索引,最后将该节点放到新数组的该索引位置处
2)、如果旧数组中的头节点为树节点,则按树节点的方式处理。
3)、如果旧数组中的头节点有下一个节点,则将下一个节点赋值给next,经过观测可以发现,我们使用的是2次幂的扩展(指长度扩为原来2倍),所以,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置。
当将该头节点放到新数组时的索引位置等于其在旧数组的索引位置再加上旧数组的长度,如果尾节点为null,则将e赋值给头节点,,并将e赋值给尾节点.;如果尾节点不为null,则将e赋值给尾节点的下一个节点,并将e赋值给尾节点。如果尾节点不为null,则将尾节点的next属性置为null,再将头节点赋值给新数组的索引位置(就数组的索引位置+旧数组的长度)。
HashMap是如何进行扩容的?的更多相关文章
- jdk7和8中关于HashMap和concurrentHashMap的扩容过程总结,以及HashMap死循环
		
题外话:为什么要hashcode进行spread? 充分使用key.hashCode()的高16位信息,保证hash分布更分散, 扩容操作是新建2倍于原表大小的新表,并将原表结点拷贝一份放在新表中,对 ...
 - 调试JDK源代码-一步一步看HashMap怎么Hash和扩容
		
调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...
 - HashMap 什么时候进行扩容呢
		
HashMap扩容: 当HashMap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在A ...
 - HashMap的put()与扩容
		
1. put() final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { HashMap.Nod ...
 - HashMap什么时候进行扩容?
		
Threshold:table数组元素个数size的大小超过threshold且且Node<K,V>[] table数组长度没有超过64时时table数组扩容.当hashmap中的元素个数 ...
 - HashMap的扩容机制,   ConcurrentHashMap和Hashtable主要区别
		
源代码查看,有三个常量, static final int DEFAULT_INITIAL_CAPACITY = 16; static final int MAXIMUM_CAPACITY = 1 & ...
 - 浅谈JAVA中HashMap、ArrayList、StringBuilder等的扩容机制
		
JAVA中的部分需要扩容的内容总结如下:第一部分: HashMap<String, String> hmap=new HashMap<>(); HashSet<Strin ...
 - JDK1.8 HashMap 扩容 对链表(长度小于默认的8)处理时重新定位的过程
		
关于HashMap的扩容过程,请参考源码或百度. 我想记录的是1.8 HashMap扩容是对链表中节点的Hash计算分析. 对术语先明确一下: hash计算指的确定节点在table[index]中的链 ...
 - 深入理解HashMap(原理,查找,扩容)
		
面试的时候闻到了Hashmap的扩容机制,之前只看到了Hasmap的实现机制,补一下基础知识,讲的非常好 原文链接: http://www.iteye.com/topic/539465 Hashmap ...
 
随机推荐
- WPF 之 MultiBinding(多路 Binding)(四)
			
一.前言  有时候 UI 需要显示的信息由不止一个数据来源决定,这时候就需要使用 MultiBinding ,即多路 Binding.  MultiBinding 与 Binding 一样均以 B ...
 - Codeforces Round #677 (Div. 3) G. Reducing Delivery Cost(dijkstra算法)
			
题目链接:https://codeforces.com/contest/1433/problem/G 题解 跑 \(n\) 遍 \(dijkstra\) 得到任意两点间的距离,然后枚举哪一条边权为 \ ...
 - Codeforces Global Round 11 A. Avoiding Zero(前缀和)
			
题目链接:https://codeforces.com/contest/1427/problem/A 题意 将 \(n\) 个数重新排列使得不存在为 \(0\) 的前缀和. 题解 计算正.负前缀和,如 ...
 - AtCoder Beginner Contest 174
			
第一次 ak ABC,纪念一下. 比赛链接:https://atcoder.jp/contests/abc174 A - Air Conditioner #include <bits/stdc+ ...
 - SCZ 20170812 T2 MFS
			
题面照例十分暴力,我再次重写一下吧-- 题目描述 有\(n\)个数构成的数列\(A\)元素为\(a_i\),你要构造一个数列\(B\),元素为\(b_i\),使得满足\(b_{i}>0,a_{i ...
 - poj 3278 Catch That Cow(记忆化广度优先搜索)
			
题意: 0到N的数轴上,每次可以选择移动到x-1,x+1,2*x,问从n移动到k的最少步数. 思路: 同时遍历三种可能并记忆化入队即可. Tips: n大于等于k时最短步数为n-k. 在移动的过程中可 ...
 - manacher算法——回文串计算的高效算法
			
manacher算法的由来不再赘述,自行百度QWQ... 进入正题,manacher算法是一个高效的计算回文串的算法,回文串如果不知道可以给出一个例子:" noon ",这样应该就 ...
 - 2019牛客暑期多校训练营(第三场)B题、H题
			
传送门 题意: 就是说给你一个由0或1组成的字符串,让你找出来一个0的数量和1的数量相等的最长子字符串和最长子序列 题解: 可以把0当作-1,把1当作1来计算字符串的前缀和 这样的话,当两个位置的前缀 ...
 - SQL 计算表A字段在表B字段中出现的次数
			
SELECT A.Id,A.Name,COUNT(B.LiveID) AS count from SetLiveHistory B RIGHT JOIN Live A ON B.LiveId=A.Id ...
 - 操作系统 part1
			
实验好多,人好累... 一.进程和线程 references: 进程三种基本状态 进程和线程的概念.区别和联系 进程和线程的主要区别(总结) 进程间通信IPC 1.进程 进程,是资源分配和调度的基本单 ...