HashMap
Frank-fu
这个作者很懒,什么都没留下…
展开
-
判断是否为空
import org.apache.commons.lang3.StringUtils;import java.util.Collection;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 基础数据校验 * * @author frank * @module * @date 2021/9/4 13:51 */public class EmptyUt.原创 2021-09-04 14:42:25 · 227 阅读 · 0 评论 -
HashMap原理
HashMap原理属性newHashMap()HashMap(int initialCapacity)HashMap(int initialCapacity, float loadFactor)put原理属性loadFactor:加载因子。作用:主要参与计算阈值大小的table:数组。作用:用来存放数据size:HashMap存放元素的数量。作用:记录存放元素的数量,以及参与判断是否需要扩容条件之一threshold:阈值。作用:当table数组中存放的数据量达到阈值大小,则进行扩容。计算方式:原创 2020-09-10 19:42:06 · 105 阅读 · 0 评论 -
HashMap之getTreeNode
HashMap之treeifyBin前提作用业务逻辑整理源码分析getTreeNodefind前提jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用根据key查找树结构中与之一致的对象业务逻辑整理1,如果table数组为空,或者大小未超过64,则重置table大小2,如果table大小超过64,把当前链表转换成红黑树2.1,循环链表,把每一个对象转换成红黑树,并绑定上下级关系2.2,重置红黑树相关原创 2020-09-09 15:14:48 · 426 阅读 · 0 评论 -
HashMap之get
HashMap之treeifyBin前提作用业务逻辑整理源码分析getgetNode前提jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用根据key查找与之一致的对象,并返回对象的value值业务逻辑整理1,table不能为空,长度要大于0,根据key计算出对应的下标,该下标下的对象不能为空,否则返回空2,该下标对象(frist)的key与查找的可以是否一致,如果一致,则返回当前对象3,frist的下原创 2020-09-03 15:30:51 · 196 阅读 · 0 评论 -
HashMap之putTreeVal
HashMap之treeifyBin前提:作用业务逻辑整理源码分析前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用数据超过阈值则进行扩容链表转成红黑树业务逻辑整理1,如果table数组为空,或者大小未超过64,则重置table大小2,如果table大小超过64,把当前链表转换成红黑树2.1,循环链表,把每一个对象转换成红黑树,并绑定上下级关系2.2,重置红黑树相关信息源码分析/原创 2020-09-03 15:05:51 · 566 阅读 · 0 评论 -
HashMap之balanceInsertion
HashMap之treeifyBin前提:作用业务逻辑整理源码分析前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用数据超过阈值则进行扩容链表转成红黑树业务逻辑整理1,如果table数组为空,或者大小未超过64,则重置table大小2,如果table大小超过64,把当前链表转换成红黑树2.1,循环链表,把每一个对象转换成红黑树,并绑定上下级关系2.2,重置红黑树相关信息源码分析s原创 2020-09-01 14:15:29 · 398 阅读 · 0 评论 -
HashMap之treeify
HashMap之treeify前提作用业务逻辑源码分析前提作用把Node对象转换成TreeNode结构把链表结构转换成树结构业务逻辑源码分析/** * Forms tree of the nodes linked from this node. * @return root of tree */final void treeify(Node<K,V>[] tab) { TreeNode<K,V> root = null; for (TreeN原创 2020-08-31 16:34:08 · 555 阅读 · 0 评论 -
HashMap之keySet
HashMap之keySet前提作用代码keySet函数分析KeySet类分析KeyIterator类分析大招结果前提了解迭代器作用获取map的所有的key代码keySet函数public Set<K> keySet() { Set<K> ks; return (ks = keySet) == null ? (keySet = new KeySet()) : ks;}分析如果keySet是空的,那么就new一个,否则就返回keySet懵逼原创 2020-08-27 14:39:17 · 1335 阅读 · 0 评论 -
HashMap之moveRootToFront
HashMap之moveRootToFront前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用确定红黑树的根节点是HashMap的table数组中的值业务逻辑整理1,红黑树根节点不能为空,table数组不能为空2,获取红黑树根节点的应该放入的下标位置3,如果当前的下标位置放得对象与需要验证的对象,不是同一个对象3.1,设置红黑树根节点的值为改下标位置的值3.2,重置红黑树根节点的上下级关原创 2020-08-24 17:43:16 · 527 阅读 · 0 评论 -
HashMap之treeifyBin
HashMap之treeifyBin前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法作用数据超过阈值则进行扩容链表转成红黑树业务逻辑整理1,如果table数组为空,或者大小未超过64,则重置table大小2,如果table大小超过64,把当前链表转换成红黑树2.1,循环链表,把每一个对象转换成红黑树,并绑定上下级关系2.2,重置红黑树相关信息以下是详细注释/** * Replac原创 2020-08-21 18:27:33 · 690 阅读 · 4 评论 -
HashMap之数组下标计算
HashMap之原理初始化loadFactorcapacitythreshold数组下标计算前提:HashMap是有数组+链表组成的,其中使用的算法有:hash(java8又使用了红黑树)初始化loadFactorloadFactor是参与计算HashMap扩容的一个加载因子new HashMap()会默认给loadFactor加载一个值0.75capacitycapacity并非HashMap的属性,指的是HashMap数组的大小,即table.lengththreshold原创 2020-08-21 13:58:01 · 3574 阅读 · 2 评论 -
HashMap之属性
HashMap之属性table注释作用entrySetsize注释作用modCount注释作用threshold注释作用loadFactor注释作用table/** * The table, initialized on first use, and resized as * necessary. When allocated, length is always a power of two. * (We also tolerate length zero in some operations t原创 2020-08-20 17:30:52 · 1208 阅读 · 0 评论 -
HashMap源码分析目录
HashMap源码分析目录链接: HashMap之resize链接: HashMap之hash链接: HashMap之clear链接: HashMap之remove链接: HashMap之containsKey链接: HashMap之put链接: HashMap之tableSizeFor链接: 运算符之位运算符原创 2020-08-20 14:48:34 · 112 阅读 · 0 评论 -
HashMap之resize
HashMap之resize/** * Initializes or doubles table size. If null, allocates in * accord with initial capacity target held in field threshold. * Otherwise, because we are using power-of-two expansion, the * elements from each bin must either stay at sam原创 2020-08-20 14:17:21 · 135 阅读 · 0 评论 -
HashMap之hash
HashMap之hash业务逻辑整理1,如果key为空,则hash值为0,否则获取key的hashCode,并右位移16位,在与原值^计算/** * Computes key.hashCode() and spreads (XORs) higher bits of hash * to lower. Because the table uses power-of-two masking, sets of * hashes that vary only in bits above the cu原创 2020-08-14 15:49:59 · 96 阅读 · 0 评论 -
HashMap之clear
HashMap之clear先水一篇业务逻辑整理1,当前对象不为空,遍历对象,把每个hash对应下标的对象都设为空/** * Removes all of the mappings from this map. * The map will be empty after this call returns. */public void clear() { Node<K,V>[] tab; modCount++; if ((tab = table) !=原创 2020-08-14 15:36:00 · 287 阅读 · 0 评论 -
HashMap之remove
HashMap之remove前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法业务逻辑整理1,map不能为空,且hash对应的下标要存在。否则返回null2,取下标对应的对象,如果该对象的key与入参key一致,则返回该对象(node)3,否则,获取该对象的下一个对象4,如果当前对象是树结构,则调用getTreeNode,返回key对应的对象(node)5,如果不是树结构,循环对象,如果存在对象的key原创 2020-08-13 18:08:16 · 706 阅读 · 0 评论 -
HashMap之containsKey
HashMap之containsKey前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法业务逻辑整理1,map不能为空,且hash对应的下标要存在。否则返回null2,取下标对应的对象,如果该对象的key与入参key一致,则返回该对象3,否则,获取下一个对象,如果该对象为空,返回null4,如果当前对象是树结构,则调用getTreeNode,获取是否存在5,如果不是树结构,循环对象,如果存在对象的key原创 2020-08-13 16:13:23 · 2605 阅读 · 0 评论 -
HashMap之put
HashMap之put前提:jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法业务逻辑整理1,判断当前map是否为空的,如果是则初始化。2,判断当前key的hash是否存在map中,2.1,如果不存在则直接添加对象当map中2.2,如果存在2.2.1,如果第一个的key与put的key一致,则把一致的对象赋值给e2.2.2,如果对象为红黑树存储方式,则把一致的对象赋值给e2.2.3,否则(存储方式非红原创 2020-08-13 14:01:33 · 112 阅读 · 0 评论 -
HashMap之tableSizeFor
HashMap之tableSizeFor/** * Returns a power of two size for the given target capacity. * 根据入参的值(cap),返回一个2幂次方的值 */static final int tableSizeFor(int cap) { //入参值减一,如:cap =10 则 n = 9 int n = cap - 1; // n >>> 1 ==>> (n >>原创 2020-08-11 18:21:06 · 99 阅读 · 0 评论