今年9月份要找工作了,很期待,也很担心,毕竟做了这么多年的java开发,对java仍然是停留在“我会用”的层面上,“精通”两字说出来就太贴脸了。但!(就是这么生硬的转折)我要用暑假恶补两个月java知识,在此立个flag。
“我要在简书上每天更新一篇技术知识” ——小码
今天先来个简单的,听说面试会经常面到的HashMap,要想了解HashMap,我们先来说一下它的数据结构
HashMap是一个“链表数组”,首先它是一个数组,其次每个数组元素存储的是链表。下面一一介绍HashMap中的方法
1、构造方法
HashMap构造方法中定义了数组长度initCapacity(默认值16)和负载因子loadFactor(默认值0.75),容量大小threshold为capacity * loadFactor,其中capacity为大于initCapacity的最小2的n次方值。
2、put(key,value)
步骤1:key为null,调用putForNullKey方法(好像是插入到数组第一个元素)
步骤2:根据hash算法,计算key在数组中的下标
步骤3:遍历当前数组元素,找出相同key值的,若存在相同key值的,则覆盖value
步骤4:若不存在,则插入到链表头部
3、get(key)
步骤1:key为null,调用getForNullKey方法
步骤2:根据hash算法,计算key在数组中的下标
步骤3:遍历当前数组元素,找出相同key值的,若存在,则取出该value
步骤4:若不存在,则返回null
Tip:
其中hash算法为hash & (capacity - 1),这是一个对hash值取模运算,&运算比算术取模运算速度要快,其次为什么是采用capacity - 1进行&运算,是为了减少hash值冲突次数(不同hash值存在同一数组元素下示为冲突)