HashMap知识点总结(附源码分析链接)

本文详细介绍了HashMap的基础知识,包括其在JDK1.8中的变化,如添加红黑树数据结构、扩容机制、位运算优化等。还对比了HashMap与Hashtable的区别以及线程安全的集合实现,如Hashtable、ConcurrentHashMap和Collections.synchronizedMap().
摘要由CSDN通过智能技术生成



一、HashMap基础篇

  1. 讲下对HashMap的认识
  2. HashMap的初始化默认参数
  3. HashMap的扩容机制
  4. HashMap 在 JDK1.8 中扩容 resize( ) 方法扩容流程(和之前版本的区别)
  5. HashMap为什么在JDK1.8为添加了红黑树的数据结构
  6. 链表升级成红黑树的条件
  7. 红黑树退化成链表的条件
  8. 为什么Hashmap的长度必须是2的n次幂
  9. HashMap获取的hash值的方法(HashMap可以存key为null的主键吗)
  10. HashMap 为什么在获取 hash 值时要进行位运算
  11. HaspMap的初始化时数组长度和加载因子的约束范围
  12. JDK1.8之前HashMap采用头插法插入元素的隐患
  13. HashMap 的 get 方法的流程分析
  14. HashMap 的 put 方法的流程分析
  15. HashMap 在扩容时为什么通过位运算 (e.hash & oldCap) 得到新数组下标

二、同类数据结构对比

  1. HashMap和Hashtable的区别
  2. HashMap的三种线程安全集合对比(Hashtable,ConcurrentHashMap,Collections.synchronizedMap() )

未完待续…


HashMap基础篇


1、讲下对HashMap的认识

HashMap存储的是键值对 key - value,key具有唯一性,是哈希表数据结构在 Java 中的经典体现,采用了链地址法来处理哈希冲突。

  1. HashMap底层的数据结构在 JDK1.8 中有了较大的变化,1.8之前采用数组加链表的数据结构,1.8采用数组加链表加红黑树的数据结构。 - HashMap为什么在JDK1.8为添加了红黑树的数据结构
  2. 1.8之前采用头插法插入 key - value,1.8采用尾插法。 - JDK1.8之前HashMap采用头插法插入元素的隐患
  3. HashMap 是线程不安全的,类似的线程安全的集合有 HashTable 和 ConcurrentHashMap 。 - HashMap 和 HashTable 的比较 - HashMap 和 ConcurrentHashMap 之间的对比
  4. 在 1.8 版本的中 resize( ) 方法也有了很大的改变,提升了扩容性能。 - HashMap 在 JDK1.8 中的扩容流程(源码分析)


2、HashMap的初始化默认参数
  1. HashMap的加载因子默认是0.75,Node数组 (桶) 的初始长度为16。
  2. 在 HashMap 初始化时可以设置初始长度和加载因子 - HaspMap的初始化时数组长度和加载因子的约束范围,但是数组长度必须满足 2 的 n 次幂(不满足也能初始化成功) - 为什么Hashmap的长度必须是2的n次幂
  3. 临界值 threshold = 加载因子 * 数组长度,默认初始的时候是 16 * 0.75 = 12。
  4. 源码中的一些默认参数如下:
	//HashMap的默认初始长度16
	static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 
	
	//HashMap的最大长度2的30次幂
	static final int MAXIMUM_CAPACITY = 1 << 30;
	
	//HashMap的默认加载因子0.75
	
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值