一、概述
从本文你可以学习到:
- 你知道HashMap的工作原理吗?
- 你知道get和put的原理吗?equals()和hashCode()的都有什么作用?
- 你知道hash的实现吗?为什么要这样实现?
- 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
几个关键的信息:基于Map接口实现、允许null键/值、非同步、不保证有序(比如插入的顺序)、也不保证序不随时间变化。
二、两个重要的参数
在HashMap中有两个很重要的参数,容量(Capacity)和负载因子(Load factor)
简单的说,Capacity就是bucket的大小,Load factor就是bucket填满程度的最大比例。如果对迭代性能要求很高的话,不要把capacity
设置过大,也不要把load factor
设置过小。当bucket中的entries的数目大于capacity*load factor
时就需要调整bucket的大小为当前的2倍。
Capacity默认值是16,Load factor默认值是0.75f
三、put函数的实现
put函数大致的思路为:
- 对key的hashCode()做hash,然后再计算index;
- 如果没碰撞直接放到bucket里;
- 如果碰撞了,以链表的形式存在buckets后;
- 如果碰撞导致链表过长(大于等于
TREEIFY_THRESHOLD
),就把链表转换成红黑树; - 如果节点已经存在就替换old value(保证key的唯一性)
- 如果bucket满了(超过
load factor*current capacity
),就要resize。 more >>