HashMap

目录

一、底层实现

1.1 jdk 1.7之前

1.2 jdk 1.8之后

二、扩容

三、和 HashTable 区别

四、(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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值