目录
四、(Android特有)和 SparseArray、ArrayMap 区别
一、底层实现
1.1 jdk 1.7之前
底层结构是数组,每个数组元素是一个链表。同一个链表的 hash 值是一样的,称作哈希碰撞。
1.2 jdk 1.8之后
在 jdk 1.7 的结构基础上,如果某个链表长度超过8个之后,该链表会转为红黑树结构。而红黑树节点数小于6个,则转回链表结构。
二、扩容
HashMap数组默认长度是16,负载因子是0.75,如果添加数据后,数组内元素个数大于 16*0.75 = 12 个,则会触发扩容。
每次扩容数组长度变为之前的2倍。
扩容后会调整原存储节点的位置,按新的长度计算 hash,并移动到新的位置。因此扩容很消耗性能。
三、和 HashTable 区别
- HashMap 是线程不安全的,HashTable 是线程安全的;
- HashMap 允许 key、value 为 null,不过只能有一个 key 为 null,HashTable 不允许;
- HashMap 默认长度 16,默认扩容 2n,HashTable 默认长度11,默认扩容 2n+1;
四、(Android特有)和 SparseArray、ArrayMap 区别
- SparseArray 底层实现是 key 的数组和 value 的数组;
- SparseArray 的 key 只能是 int 类型,避免了装箱操作;
- SparseArray 采用二分法查找确定元素位置;
- ArrayMap 和 SparseArray 类似,但 key 类型不仅限于 int;